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