Hi Frank, In your compiled main program, you have a statement c->Print(); before c->Draw(); Because there has been no graphics at this point, Root thinks it is in batch mode. If you move the Print statement after c->Draw(), you will see the canvas with the histograms. I will look how to modify the logic to avoid this side effect. Rene Brun On Fri, 5 Nov 1999, Frank Hartmann wrote: > Hi all, > > > We like to transfer a TCanvas from shared memory TMapFile into > a server and then via TSocket to the client. This works well for > objects like TH1 and TList and some other. > It works for TCanvas by using some ROOT macros, but we have problems > with the compiled version (KAI C++ 3.3E compiler). I have the impression > that the TCanvas is not completly extracted out of the shared memory. > I'm not absolutetly sure about initialization of root in compiled version, > but more about it later. > I provide the code of the macros and the compiled verions. > > > here are the code of the macros which are working fine: > ***************************** > 1.) Producer of shared memory > > #ifndef __CINT__ > #include <iostream.h> > #include "TROOT.h" > #include "TH1.h" > #include "TH2.h" > #include "TRandom.h" > #include "TMapFile.h" > #include "TSystem.h" > #include "TDirectory.h" > int main () > { > TROOT producer("producer","Simple histogram producer to shared memory > "); > #endif > #ifdef __CINT__ > { > gROOT->Reset(); > #endif > > //Now create the memory map file > > //TMapFile *mfile; > // mfile = TMapFile::Create("hsimple.map","RECREATE", 50000, > // "Demo memory mapped file with histograms"); > > // Create 1d and 2d histograms. These objects will > // be automatically added to the current directory, i.e. mfile. > TCanvas *c1; > TPad *pad1, *pad2, *pad3; > c1 = new TCanvas("c1","Shared Memory Consumer > Example",200,10,700,780); > pad1 = new TPad("pad1","This is pad1",0.02,0.52,0.98,0.98,21); > pad2 = new TPad("pad2","This is pad2",0.02,0.02,0.48,0.48,21); > pad3 = new TPad("pad3","This is pad3",0.52,0.02,0.98,0.48,21); > pad1->Draw(); > pad2->Draw(); > pad3->Draw(); > > TH1F *histo1; > TH1F *histo2; > TH2F *histo3; > > pad1->cd(); > histo1 = new TH1F("histo1","Muon Energy",50,0,30); > histo1->SetXTitle("muon energy"); > histo1->SetYTitle("event count"); > histo1->SetFillColor(48); > histo1->Draw(); > > pad2->cd(); > histo2 = new TH1F("histo2","Muon Pt",50,0,30); > histo2->SetXTitle("muon pt"); > histo2->SetYTitle("event count"); > histo2->SetFillColor(48); > histo2->Draw(); > > pad3->cd(); > histo3 = new TH2F("histo3","Muon py vs px",50,0,30,50,0,30); > histo3->SetXTitle("muon px"); > histo3->SetYTitle("muon py"); > histo3->Draw(); > Float_t muon_Energy,muon_Pt,muon_Px,muon_Py; > for (Int_t i = 0; i < 2500; i++) { > //get random number for muon px and py: > gRandom->Rannor(muon_Px,muon_Py); > muon_Px = muon_Px + 10.; > muon_Py = muon_Py + 10.; > muon_Pt = sqrt(muon_Px*muon_Px+muon_Py*muon_Py); > muon_Energy = sqrt(0.105*0.105+muon_Pt*muon_Pt); > histo1->Fill(muon_Energy,1.0); > histo2->Fill(muon_Pt,1.0); > histo3->Fill(muon_Px,muon_Py,1.0); > } > c1->Draw(); > //Now create the memory map file > > TMapFile *mfile; > mfile = TMapFile::Create("hsimple.map","RECREATE", 50000, > "Demo memory mapped file with histograms"); > mfile->Add(c1); > > > mfile->Update(); > mfile->Print(); > mfile->ls(); > > > } > > ****************** > 2.) reding from shared memory and sending client over TSocket > > { > // Open the memory mapped file "hsimple.map" in "READ" (default) mode. > mfile = TMapFile::Create("hsimple.map"); > // Print status of mapped file and list its contents > mfile->Print(); > mfile->ls(); > //gROOT->cd(); > TSocket *sock = new TSocket("localhost", 9090); > TMessage mess(kMESS_OBJECT); > TCanvas *c = (TCanvas *) mfile->Get("c1"); > c->ls(); > c->Draw(); > mess.Reset(); > printf("hallo1"); > mess.WriteObject(c); // write object in message buffer > printf("hallo2"); > sock->Send(mess); > } > *************** > 3.) receiving and displaying in a client macro is no issue. > > ************************ > > ********here are the codes for the compiled versions > producer is more or less the same: > problems start in the reading of the TCanvas from shared memory, we are > able to > read it ls() and Print() the TMapFile and ls() the TCanvas or > (c1->ListOfPrimitives)->ls() but we are not able to Draw() or Print() the > TCanvas. > > code: > > #include "TROOT.h" > #include "TApplication.h" > #include "TCanvas.h" > #include "TLine.h" > #include "TPaveLabel.h" > #include <iostream.h> > #include "TH1.h" > #include "TH2.h" > #include "TRandom.h" > #include "TMapFile.h" > #include "TSystem.h" > #include "TDirectory.h" > #include "TPad.h" > #include "TSocket.h" > #include "TMessage.h" > #include "TPad.h" > extern void InitGui(); > VoidFuncPtr_t initfuncs[] = { InitGui, 0 }; > > TROOT root("hello","Hello World", initfuncs); > > int main(int argc, char **argv) > { > TApplication theApp("App", &argc, argv); > > > TMapFile *mfile; > mfile = TMapFile::Create("hsimple.map"); > mfile->Print(); > mfile->ls(); > // gROOT->cd(); > TSocket *sock = new TSocket("localhost", 9090); > TMessage mess(kMESS_OBJECT); > TCanvas *c = (TCanvas *) mfile->Get("c1"); > printf("hallo1 \n"); > c->ls(); > printf("hallo1 \n"); > (c->GetListOfPrimitives())->ls(); > printf("hallo2 \n"); > // it works up to here > c->Print(); > printf("hallo3 \n"); > c->Draw(); > mess.Reset(); > printf("hallo4 \n"); > > mess.WriteObject(c); // write object in message buffer > printf("hallo5 \n"); > sock->Send(mess); > > // Here we don't return from the eventloop. "Exit ROOT" will quit the > app. > theApp.Run(); > > return 0; > } > > > > By defining another Canvas and drawing it before taking the > Canvas from shared memeory, the situation changes, Print(0 is now possible > and > Draw() too (not really only the canvas without histogramms is displayed) > > I think the problem is based in some members of TCanvas which are pointers > and I think are pointing to a certain window scope. > > Is there a method to transfer grafic objects via the shared memory > without having to bother about these things or will it be implemented? > > Any help will be appreciated. > > cheers > Frank > > > ************* (-; ****LIVE LONG AND PROSPER**** ;-) **************** > Frank Hartmann > Institut fuer Experimentelle Kernphysik > *Universitaet Karlsruhe | Forschungszentrum Karlsruhe/Bau 401 > Engesserstr. 7 | Hermann-von-Helmholtz-Platz > 76128 Karlsruhe | 76344 Eggenstein-Leopoldshafen > Phone: +49-721-608-3418 | Phone: +49-7247-82-4803 > Fax: +49-721-607-262 | Fax: +49-7247-82-3414 > Email: hartmann@fnal.gov | WWW: http://iekp-kcdf3.fzk.de > ------------------------------ > Fermilab MS 318 > P.O.Box 500 Phone ++1 630 840 8240 > Batavia 60510,Il Fax: ++1 630 840 2968 > > > >
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:42 MET