Re: [ROOT] Another bug in TTimer on windows

From: Valeri Fine (fine@bnl.gov)
Date: Mon Mar 18 2002 - 18:41:02 MET


----- Original Message ----- 
From: "Anton Fokin" <anton.fokin@smartquant.com>
To: "roottalk" <roottalk@pcroot.cern.ch>
Sent: Monday, March 18, 2002 6:31 AM
Subject: [ROOT] Another bug in TTimer on windows


> Hello,
> 
> single shot async mode doesn't work under windows (dont know about Linux)
> 
> This below doesn't trigger timer (HandleTimer) at all
> 
>   fTimer = new TTimer(this, 1000, kFALSE);
>   fTimer->Start(1000, kTRUE);
> 
> Although this 
> 
>   fTimer = new TTimer(this, 1000, kFALSE);
>   fTimer->Start(1000);
> 
> does (constantly).

  Anton,  why each time one has to ask you one and the same thing 
  to be provided ?

  - A simple test or example to reproduce the problem.
  - If you have found a problem reason and fix it  then the correction 
    and test are appreciated.

   Can you memorize that ;-)

Coming back to the problem you reported:

I did not know about Start method.
I've looked it up. From the first glance it is NOT correct.
http://root.cern.ch/root/html/src/TTimer.cxx.html#TTimer:Start  

 void TTimer::Start(Int_t milliSec, Bool_t singleShot)
{
   if (milliSec >= 0)
      SetTime(milliSec);
   Reset();
   TurnOn();
   if (singleShot)
      Connect(this, "Timeout()", "TTimer", this, "TurnOff()");
   else
      Disconnect(this, "Timeout()", this, "TurnOff()");
}

  My guess the methods Connect/Disconnect may have been called too late.
  To avoid the problem I would recommend to change the order of the methods above, namely:

 void TTimer::Start(Int_t milliSec, Bool_t singleShot)
{
   if (milliSec >= 0)
      SetTime(milliSec);
   Reset();
 //    TurnOn();  // move this statement
   if (singleShot)
      Connect(this, "Timeout()", "TTimer", this, "TurnOff()");
   else
      Disconnect(this, "Timeout()", this, "TurnOff()");
   TurnOn(); // New position of the method
}

I mean FIRST the signal/slot connection must be established and THEN the timer
should be fired but ... TurnOn
http://root.cern.ch/root/html/src/TTimer.cxx.html#TTimer:TurnOn
calls

   Disconnect(this, "Timeout()", this, "TurnOff()");

??? That is NOT what we want for the single shot case.

I wonder if one can provide the timeout that is long enough to get Signal/Slot
connection made established then everything should (?)  work properly with no change.

  Can one check this ?
               Thank you
                          Best regards, Valeri

> 
> /Anton
> 
> http://www.smartquant.com
>   
>   
> 



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