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

From: Valeriy Onuchin (onuchin@fnal.gov)
Date: Tue Mar 13 2001 - 19:11:16 MET


Stefano Argiro` wrote:

> Return-Path: <owner-roottalk@pcroot.cern.ch>
> Received: from sirius-b.ihep.su by altair.ihep.su (MX V4.2 AXP) with SMTP; Tue,
>           13 Mar 2001 12:40:56 GMT+03:00
> Received: from pcroot.cern.ch (pcroot.cern.ch [137.138.213.102]) by
>           sirius-b.ihep.su (8.10.0/8.10.0) with ESMTP id f2D9eOA28914; Tue, 13
>           Mar 2001 12:40:25 +0300 (MSK)
> X-Sender: owner-roottalk@pcroot.cern.ch
> Received: (from majordomo@localhost) by pcroot.cern.ch (8.8.7/8.8.7) id
>           JAA30054 for roottalk-outgoing; Tue, 13 Mar 2001 09:47:52 +0100
> X-Authentication-Warning: pcroot.cern.ch: majordomo set sender to
>     owner-roottalk@root.cern.ch using -f
> Received: from newmint.cern.ch (newmint.cern.ch [137.138.26.94]) by
>           pcroot.cern.ch (8.8.7/8.8.7) with ESMTP id JAA30051 for
>           <roottalk@pcroot.cern.ch>; Tue, 13 Mar 2001 09:47:51 +0100
> Received: from carmen.to.infn.it (carmen.to.infn.it [192.84.137.1]) by
>           newmint.cern.ch (8.9.3/8.9.3) with ESMTP id JAA10232 for
>           <roottalk@pcroot.cern.ch>; Tue, 13 Mar 2001 09:47:51 +0100 (MET)
> Received: from to01xd.to.infn.it (to01xd.to.infn.it [192.84.137.11]) by
>           carmen.to.infn.it (8.9.3/8.9.3) with ESMTP id JAA24815 for
>           <roottalk@pcroot.cern.ch>; Tue, 13 Mar 2001 09:47:50 +0100 (MET)
> Received: from localhost (argiro@localhost) by to01xd.to.infn.it (8.8.8/8.8.8)
>           with ESMTP id JAA12842 for <roottalk@root.cern.ch>; Tue, 13 Mar 2001
>           09:47:50 +0100 (MET)
> Date: Tue, 13 Mar 2001 09:47:50 +0100 (MET)
> From: Stefano Argiro` <argiro@to.infn.it>
> To: roottalk@pcroot.cern.ch
> Subject: [ROOT] questions on TApplication's and TTimer's
> Message-ID: <Pine.OSF.4.10.10103130921120.5325-100000@to01xd.to.infn.it>
> MIME-Version: 1.0
> Content-Type: TEXT/PLAIN; charset=US-ASCII
> Sender: owner-roottalk@pcroot.cern.ch
> Precedence: bulk
>
> 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;
>
> }

Hi Stefano,
I modified your code which allows to work it with signal/slots

 - cut the text below and save it as Readout.C
 - compile it:

    $root -b -q >/dev/null tmp.C | echo '{gSystem->CompileMacro("Readout.C","kf");}' >tmp.C
    $g++ -o readout Readout.C `root-config --cflags --libs` -DSTANDALONE

 - run it

    $./readout

 Note: it's quick&dirty .. few mem.leaks exist (fix it by yourself).

hth. Regards.    Valeriy

---------------------------- Readout.C ---------------------------------

#include <TApplication.h>
#include <iostream>
#include <TTimer.h>

class Readout
{
private:
   TApplication*   ftheApplication;
   Int_t           fEvents;         // number of events

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

Readout::Readout()
{
   ftheApplication = new TApplication("",0,0);
   fEvents = 0;
}

void Readout::ForceReadout()
{
   // do the readout ...
}

void Readout::HandleTimer()
{
   // do the readout , save etc....

   fEvents++;
   cout <<  "do the readout , save etc...." << fEvents << endl;
   ForceReadout();

   if(fEvents>50) Stop();
}

void Readout::Start()
{
   TTimer * timer = new TTimer(200);
   timer->Connect("Timeout()","Readout",this,"HandleTimer()");
   timer->TurnOn();
   ftheApplication->Run();
   return;
}

void Readout::Stop()
{
   ftheApplication->Terminate();
   return;
}

//////////////////////////////////////////////////////////////////
#ifdef STANDALONE

#include <TROOT.h>
#include <TSystem.h>

int main(){

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

   gSystem->Load("./Readout_C");
   Readout  * readout = new Readout();
   readout->Start();
   return 0;

}
#endif //STANDALONE

---------------------------- Readout.C ---------------------------------



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