1 module des.util.timer; 2 3 import std.datetime; 4 import core.thread; 5 6 /// 7 struct TimerCallback 8 { 9 double time=0; /// 10 double tick=0; /// 11 void delegate() func; /// 12 13 /// 14 void reset() { time = 0; } 15 16 /// 17 void update( double dt ) 18 { 19 time += dt; 20 if( time > tick ) 21 { 22 time = 0; 23 if( func ) func(); 24 } 25 } 26 } 27 28 /// 29 class Timer 30 { 31 StopWatch sw; /// 32 double time=0; /// 33 double all_time=0; /// 34 size_t cbindex=0; /// 35 36 TimerCallback[string] callback; /// 37 38 /// 39 this() { sw.start(); } 40 41 /// 42 string every( double dt, void delegate() fnc ) 43 { 44 import std.string; 45 auto key = format( "__auto_gen_callback_%04d", cbindex++ ); 46 callback[key] = TimerCallback( 0, dt, fnc ); 47 return key; 48 } 49 50 /// 51 void every( double dt, string key, void delegate() fnc ) 52 { callback[key] = TimerCallback( 0, dt, fnc ); } 53 54 /// 55 void removeCallback( string key ) 56 { callback.remove(key); } 57 58 /// 59 double reset() 60 { 61 auto r = time; 62 time = 0; 63 foreach( cb; callback ) cb.reset(); 64 return r; 65 } 66 67 /// 68 void restart( double s=0 ) 69 { 70 cycle(); 71 Thread.sleep( dur!"usecs"(cast(ulong)(s*1e6)) ); 72 } 73 74 /// 75 double hardReset() 76 { 77 auto r = all_time; 78 all_time = 0; 79 reset(); 80 return r; 81 } 82 83 /// 84 double cycle() 85 { 86 sw.stop(); 87 auto dt = sw.peek().to!("seconds",double); 88 sw.reset(); 89 sw.start(); 90 time += dt; 91 all_time += dt; 92 foreach( cb; callback ) cb.update( dt ); 93 return dt; 94 } 95 }