CMsgRootProducer.cc

From GlueXWiki
Revision as of 10:09, 26 June 2009 by Wolin (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

// Example shows how to serialize root object and publish it via cMsg // // Elliott Wolin, JLab, 26-jan-2009


// include files

  1. include <iostream>
  2. include <iomanip>
  3. include <string>
  4. include <stdlib.h>


// for cMsg

  1. include "cMsg.hxx"


// root include files

  1. include "TH1F.h"
  2. include "TMessage.h"


using namespace std; using namespace cmsg;


// misc variables */ static string url = "cMsg://localhost/cMsg"; static int hcount = 0; static int debug = 0; static int done = 0;


// prototypes */ void decode_command_line(int argc, char **argv);


//---------------------------------------------------------------- //----------------------------------------------------------------


int main (int argc, char **argv) {


 // decode command line
 decode_command_line(argc,argv);


 try {
   // create and fill a root hist object
   TH1F *hist = new TH1F("fhist","This is the TH1F hist title",100,0.,100.);
   for(int i=0; i<10000; i++) hist->Fill(float(1+int(100.0*(rand()/(RAND_MAX+1.0)))));


   // create TMessage object that contains serialized version of hist object
   TMessage *tm = new TMessage(kMESS_OBJECT);
   tm->WriteObject(hist);


   // connect to cMsg server
   cMsg c(url,"hproducer","histogram producer");
   c.connect();


   // create and fill cMsg message
   //  byte array filled with contents of TMessage object internal buffer, 
   //    which contains serialized root object
   cMsgMessage m;
   m.setSubject("root");
   m.setType("hist");
   m.setByteArrayNoCopy(tm->Buffer(),tm->Length());


   // send message
   while(!done) {
     c.send(m);
     hcount++;
     cout << "sent message " << hcount << endl;
     done=hcount>=10;
     sleep(1);
   }


   // done
   c.disconnect();


 } catch(cMsgException &e) {
   cout << "?cMsg exception:  " << e.what() << endl;
   exit(EXIT_FAILURE);
 } catch(...) {
   cout << "?unknown exception" << endl;
   exit(EXIT_FAILURE);
 }


 exit(EXIT_SUCCESS);

}


//----------------------------------------------------------------


void decode_command_line(int argc, char**argv) {

 const char *help = 
   "\nusage:\n\n hproducer [-url url] [-debug]\n";
 int i;
   
   
 // loop over arguments */
 i=1;
 while (i<argc) {
   if (strncasecmp(argv[i],"-h",2)==0) {
     printf("%s\n",help);
     exit(EXIT_SUCCESS);
   } else if (strncasecmp(argv[i],"-url",4)==0) {
     url=string(argv[i+1]);
     i=i+2;
   } else if (strncasecmp(argv[i],"-debug",6)==0) {
     debug=1;
     i=i+1;
   } else if (strncasecmp(argv[i],"-",1)==0) {
     printf("\n  ?unknown command line arg: %s\n\n",argv[i]);
     exit(EXIT_FAILURE);
   } else {
     break;
   }
 }
 
 return;

}


//----------------------------------------------------------------