Is this a good way of setting up a timer?

Jonathan M Davis jmdavisProg at gmx.com
Fri Jun 3 15:02:01 PDT 2011


On 2011-06-03 14:37, Andrej Mitrovic wrote:
> On 6/3/11, Jonathan M Davis <jmdavisProg at gmx.com> wrote:
> > Generally, you'd just put it to sleep for the period of time that you
> > want to
> > wait for. The only reason that I see to keep waking it up is if it could
> > be interrupted and effectively told to wake up - in which case you would
> > be sleeping and waking up over and over again, checking to see if enough
> > time had
> > passed or if you had been signaled to stop waiting.
> 
> Yeah, I should have made a better example. Basically I have a loop
> that ends either after a specific time period, or it could end by
> receiving a signal. I just use a shared book for that, this would be
> it:
> 
> while (engineActive) // shared bool
> {
> if (Clock.currTime > finalTime)
> break;
> 
> Thread.sleep(dur!("seconds")(1));
> }

Yeah. That looks fine, though currTime isn't a property (it takes an optional 
TimeZone object), so technically it should have parens. That's obviously not 
enforced at the moment though. In any case, it's essentially fine, but has 2 
potential issues, depending on how accurate you want the timing to be or how 
responsive you want the loop to be in exiting.

First off, you pay no attention whatsoever to how close the current time is to 
the final time such that there could be a few microseconds of difference 
between them and you'd still sleep for a whole second before exiting. If you 
want it to be more accurate, then it should be something more like

while(engineActive)
{
 auto curr = Clock.currTime();

 if(curr > finalTime)
 break;

 Thread.sleep(dur!"seconds(min(1, (finalTime - 
currTime).total!"seconds"())));
}

Incidentally, this use case shows that I should probably add overloads for 
some of the basic math functions for Duration... In any case, such an 
implementation would make it so that it doesn't sleep for longer than it needs 
to.

The other potential issue is responsiveness. If you want the loop to exit 
quickly after engineActive has been set to true, then you should probably be 
setting sleep to something more like 100ms (though if you set the value too 
low, then the loop wakes up more often than might be desirable, so it's a bit 
of a balancing act).

Regardless, the only potential issues lie with how quickly you want the loop 
to exit after the exit condition has been reached.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list