Dear Rene, we encountered the following problem with the hsumTimer.C example, which seems also to be connected to our SMP machines (Debian 2.1, glibc2.0 kernel 2.0.36). On our single processor machines everything works fine. It stops also on a 2-CPU-machine with a new kernel version 2.2.*. Starting the attached hsumTimer example, without the canvas-update calls in the hsumupdate()-module, everything works fine. When we uncomment the canvas operations, the timer stops after an unpredictable number of calls! The macro continues and still fills the histograms. After the end of the loop, the last canvas-update is done 'by hand'. We don't know the reason for this behaviour, but we assume it is connected with SMP and/or X. root [0] .x hsumTimer.C(10000000) 1 40866 2 79536 3 122316 4 208440 5 300195 6 392577 7 408762 <<======= here it stopped this time! 8 30000000 <<======= last update 'by hand' root [1] Another time it looked like this: ... 365 8222982 366 30000000 root [1] On our single CPU machine (otherwise identical setup), it works till the end: ... 1195 29986761 1196 30000000 root [1] Is there any experience with this kind of behaviour? Is there a way out of this problem? We use ROOT v2.22/10. Greetings, Marc ---------------------------------------- Dr. Marc Hemberger GSI, Abteilung DV&EE Planckstr. 1 64291 Darmstadt M.Hemberger@gsi.de Int_t i; Float_t ratio; TSlider *slider; TCanvas *c1; void hsumTimer(Int_t nfill=100000) { // // Simple example illustrating how to use the C++ interpreter // to fill histograms in a loop and show the graphics results // This program is a variant of the tutorial "hsum". // It illustrates the use of Timers. c1 = new TCanvas("c1","The HSUM example",200,10,600,400); c1->SetGrid(); // Create some histograms. total = new TH1F("total","This is the total distribution",100,-4,4); main = new TH1F("main","Main contributor",100,-4,4); s1 = new TH1F("s1","This is the first signal",100,-4,4); s2 = new TH1F("s2","This is the second signal",100,-4,4); total->Sumw2(); // this makes sure that the sum of squares of weights will be stored total->SetMarkerStyle(21); total->SetMarkerSize(0.7); main->SetFillColor(16); s1->SetFillColor(42); s2->SetFillColor(46); total->SetMaximum(nfill/20.); total->Draw("e1p"); main->Draw("same"); s1->Draw("same"); s2->Draw("same"); c1->Update();slider = new TSlider("slider","test",4.2,0,4.6,0.8*total->GetMaximum(),38); slider->SetFillColor(46); // Create a ProcessEventTimer and a TTimer TProcessEventTimer ptimer(300); // main loop will check events every 300 msec TTimer timer("hsumUpdate(total->GetEntries())",200); // hsumUpdate will be called every xxx msec timer.TurnOn(); // Fill histograms randomly Float_t xs1, xs2, xmain; gRandom->SetSeed(); for (Int_t i=0; i<nfill; i++) { ratio = Float_t(i)/Float_t(nfill); if (ptimer.ProcessEvents()) break; xmain = gRandom->Gaus(-1,1.5); xs1 = gRandom->Gaus(-0.5,0.5); xs2 = gRandom->Landau(1,0.15); main->Fill(xmain); s1->Fill(xs1,0.3); s2->Fill(xs2,0.2); total->Fill(xmain); total->Fill(xs1,0.3); total->Fill(xs2,0.2); } timer.TurnOff(); hsumUpdate(total->GetEntries()); } void hsumUpdate(Int_t e) { // called when Timer times out static Int_t iCount = 0; Int_t kUPDATE = 10000; //if (slider) slider->SetRange(0,ratio); //c1->Modified(); //c1->Update(); iCount ++; if(iCount % kUPDATE) { cout << iCount << " " << e << endl; } }
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:39 MET