Implementing a timer using threads

Max Samukha samukha at voliacable.com
Tue Jan 30 02:52:14 PST 2007


On Mon, 29 Jan 2007 10:55:37 -0800, BCS <BCS at pathlink.com> wrote:

>Dennis Kempin wrote:
>> Hi,
>> 
>> i just started to learn D (have been using c++ or java up to now) and am
>> wondering how to implement some kind of timer, a thread that calls a
>> delegate every n seconds.
>> This was my first idea (without flags for stopping the timer etc):
>> 
>> class Timer: Thread
>> {
>>         int run()
>>         {
>>                 while(true)
>>                 {
>>                         this.wait(1000); // wait one second
>>                         writefln("one second passed");
>>                 }
>>                 return 0;
>>         }
>> }
>> 
>> But writefln never gets executed, because this.wait is used to wait for
>> other threads than the current one. Is there any other way to get let
>> Thread sleep for some seconds (I know that there is a Sleep function for
>> Win32, but a platform independend way would be very great).
>> 
>> regards
>> Dennis
>
>I'd try something with Thread.yield and a time check.
>
>Example (insert your favorite time API)
>
>class Timer : Thread
>{
>   run()
>   {
>     auto next = CurrentTime()+inc;
>     while(running)
>     {
>       auto now = CurrentTime();
>       if(now > next)
>       {
>         dg();
>         next += inc;
>       }
>       else
>         this.yield();
>     }
>   }
>}

Be careful about Thread.yield under Windows. It calls Sleep(0) that
won't yield to a thread of a lower priority. In case of the proposed
timer this is not a problem except it will use 100% of CPU and won't
let any lower priority thread run but if you use something like a spin
lock waiting for a lower priority thread to release it, the lock will
never be released. You could use Sleep(1) or SwitchToThread() on
single processor systems. And you should use 'rep nop' for
hyperthreaded CPUs.

A platform independent way to put a thread to sleep using Phobos:
import std.c.time;

sleep(1);// secs
msleep(1000); millisecs
http://www.digitalmars.com/d/archives/digitalmars/D/29144.html

 


More information about the Digitalmars-d-learn mailing list