[ROOT] questions on TApplication's and TTimer's

From: Stefano Argiro` (argiro@to.infn.it)
Date: Tue Mar 13 2001 - 09:47:50 MET


Hi,

I would like to use a TTimer in a DAQ that has to read data  every
20 seconds. For this purpose I have implemented a class called,
say, Readout:public TObject{}  with methods, Start() , Stop(),
ForceReadout() and overriding  HandleTimer().

Class Readout has a TApplication as a data member, and upon Start()
TApplication::Run() is called.
Soon I realized that, after calling Start(), the event loop is started,
and I cannot communicate anymore with the class: I cannot tell it to
Stop() not to ForceReadout().

Is there a solution to this ? Will the signal/slot mechanism do it
(right now we are still using v2.25) ?

Thanks

I enclose an outline of the code.

////////////////////////////////////////////
class Readout:public TObject{
private:
	TApplication	ftheApplication;
	Int_t		fEvents;         // number of events 
	...

public:
 		Readout();
	void	ForceReadout()
	Bool_t	HandleTimer(TTimer *timer);
	void	Start();
	void	Stop();
        Int_t   GetEvents()  {return fEvents;};

};

Readout::Readout(){

	ftheApplication	= new TApplication("",&arc,argv,NULL,0);
	...
}

void Readout::ForceReadout(){

	// do the readout ...

}

void Readout::HandleTimer(TTimer *timer){
	// do the readout , save etc....
}

void Readout::Start(){
	TTimer * timer = new TTimer(this,20000);
 	timer->TurnOn();
	ftheApplication->Run();
		 
	return 0;	
}

Int_t CurrentMonitorRO::Stop(){
		
		ftheApplication->Terminate();	
		return 0;
}
//////////////////////////////////////////////////////////////////

int main(){

  TROOT CMReadout("CMreadout","CM readout application");

  	Readout  * readout = new CurrentMonitorRO();
	
	readout->Start();
        
	// of course it never gets here !!
        if (readout->GetEvents() == 5) cout << "Done"<<endl;	
	return 0;
			
}



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:39 MET