Re: [ROOT] Using TTimer and gSystem->ProcessEvents()

From: Rene Brun (Rene.Brun@cern.ch)
Date: Thu Aug 15 2002 - 19:14:54 MEST


Hi Ben,

You can simplify your main program and still get what you want

Rene Brun

#include "TCanvas.h"
#include "TNoisePlot.h"
#include "TSystem.h"

void loopnoise() {
  TCanvas c1("c1","My Canvas",400,400);
  TNoisePlot np;

  while(!gSystem->ProcessEvents()) {
      np.PlotHistos(&c1);
      gSystem->Sleep(100);
  }
}


On Thu, 15 Aug 2002, Ben Morgan wrote:

> Hi ROOTers,
>            I've written a very simple object TNoisePlot which holds an 
> array of thirty randomly filled histograms plus a dummy histogram to 
> ensure all are plotted correctly (this object is eventually for use with 
> data...). In a separate named script loopnoise(), I create a TNoisePlot 
> object plus a TCanvas to display the histograms. As I want to eventually 
> enter data that'll be used to generate the histograms, the script contains 
> a while loop. At each pass through the loop, the PlotHistos method of 
> TNoisePlot is called, and this regenerates and plots the histograms.
> 
> As I want the canvas to be editable between each pass through the while 
> loop, I also put a TTimer object in the script to use the 
> gSystem->ProcessEvents() command. However, after 3-4 passes through the 
> while loop, ROOT locks up completely (and with no error message). Taking 
> the TTimer related lines out stops this happening, and the loop runs fine, 
> but the canvas is no longer editable! I guess I'm probably doing something
> wrong with the TTimer. I'm using ROOT v3.02/07 on a PC running RH7.1, and 
> have attached the code below. Any 
> solutions will be most gratefully received! 
> Thanks,
> 
> Ben Morgan.
> 
> #include <TROOT.h>
> #include <TChain.h>
> #include <TFile.h>
> #include <TH1.h>
> #include <iostream.h>
> 
> 
> class TNoisePlot {
> 
> private:
>   TH1S *hNoise[30];
>   TH1S *hNoiseAxis;
> 
> public:
>   TNoisePlot();
>   ~TNoisePlot();
>   void FillHistos();
>   void PlotHistos(TCanvas *c1);
> };
> 
> TNoisePlot::TNoisePlot()
> {
>   char hname[20];
>   for(Int_t i=0; i<30; i++)
>     {
>       sprintf(hname,"noise%d",i);
>       hNoise[i] = new TH1S(hname," ",100,0,100);
>     }
> 
>   hNoiseAxis = new TH1S("hNoiseAxis"," ",100,0,100);
> }
> 
> TNoisePlot::~TNoisePlot()
> {
>   delete hNoiseAxis;
>   for(Int_t i=0; i<30; i++)
>     {
>       delete hNoise[i];
>     }
> }
> 
> void TNoisePlot::FillHistos()
> {
>  for(Int_t i=0; i<30; i++)
>     {
>       hNoise[i]->Reset();
>     }
>  hNoiseAxis->Reset();
> 
> 
>   for(Int_t i=0; i<30; i++)
>     {
>       for(Int_t j=0; j<100; j++)
> 	{
> 	  hNoise[i]->Fill(j,gRandom->Gaus(i*20,10));
> 	}
>     }
> 
>   Short_t max=0;
>   Short_t min=0;
>   for(Int_t k=0; k<30; k++)
>     {
>       if((hNoise[k]->GetMaximum())>max) max=hNoise[k]->GetMaximum();
>       if((hNoise[k]->GetMinimum())<min) min=hNoise[k]->GetMinimum();
>     }
> 
>   hNoiseAxis->SetMaximum(max);
>   hNoiseAxis->SetMinimum(min);
> }
> 
> void TNoisePlot::PlotHistos(TCanvas *c1)
> {
>   c1->cd();
>   FillHistos();
> 
>   hNoiseAxis->Draw();
> 
>  for(Int_t i=0; i<30; i++)
>     {
>       hNoise[i]->Draw("same");
>     }
>  c1->Modified();
>  c1->Update();
> }
> 
> 
> #include <iostream.h>
> #include <stdio.h>
> 
> int loopnoise()
> {
>   int ptest=0;
> 
>   TCanvas *c1 = new TCanvas("c1","My Canvas",400,400);
>   TNoisePlot *np = new TNoisePlot();
>   TTimer *ti = new TTimer("gSystem->ProcessEvents();",100,kFALSE);
> 
>   while(ptest==0)
>     {
>       cout<<"Timer turned on"<<endl;
>       ti->TurnOn();
>       cout<<"Timer reset"<<endl;
>       ti->Reset();
> 
>       //At present, enter 0 to keep loop going
>       cout<<"Enter ptest: ";
>       cin>>ptest;
> 
>       np->PlotHistos(c1);
>       cout<<"Plotted histos"<<endl;
>       ti->TurnOff();
>       cout<<"Timer turned off"<<endl;
>     }
> 
>   delete np;
>   delete c1;
>   delete ti;
> 
> 
>   return 0;
> }
> 
> 
> 
> -- 
> -------------------------------------------------------------------------------
> Mr. Ben Morgan                               Tel: 44 (0)114 22 23553 (Work)
> Postgraduate Student
> University of Sheffield
> Department of Physics & Astronomy
> Hicks Building
> Hounsfield Road
> Sheffield  S3 7RH
> -------------------------------------------------------------------------------
> 



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:04 MET