1 #ifndef _Timer_Timer_h_ 2 #define _Timer_Timer_h_ 3 4 #include <Core/Core.h> 5 6 namespace Upp { 7 8 //runs a chained list of TimerEvent stored Callbacks after sleeping 9 class Timer 10 { 11 public: 12 typedef Timer CLASSNAME; 13 Timer(); 14 virtual ~Timer(); 15 16 //API just as in Ctrl 17 public: 18 void SetTimeCallback(int delay_ms, Callback cb, intptr_t id = 0); 19 void KillTimeCallback(intptr_t id = 0); 20 void KillSetTimeCallback(int delay_ms, Callback cb, intptr_t id); 21 bool ExistsTimeCallback(intptr_t id = 0); 22 void PostCallback(Callback cb, intptr_t id = 0); 23 void KillPostCallback(Callback cb, intptr_t id); 24 25 void SetTimerGranularity(int ms); 26 27 private: 28 struct TimeEvent : public Link<TimeEvent> { 29 dword time; 30 int delay; 31 Callback cb; 32 void *id; 33 bool rep; 34 GetHashValueTimeEvent35 unsigned GetHashValue() const { return GetPtrHashValue(id); } 36 }; 37 38 void sTimeCallback(dword time, int delay, Callback cb, void *id); 39 void SetTimeCallback(int delay_ms, Callback cb, void *id); 40 void KillTimeCallbacks(void *id, void *idlim); 41 bool ExistsTimeCallback(void *id); 42 void KillTimeCallback(void *id); 43 void TimerProc(dword time, int & leftsleep); 44 45 void KillTimeCallbacks(void *id); 46 47 48 void TimerThread(); 49 50 //DATA 51 private: 52 Thread t; 53 bool run; 54 int granularity; 55 56 Mutex sTimerLock; 57 dword sTClick; 58 59 LinkOwner<TimeEvent> elist; //elements 60 //ArrayMap<unsigned, TimeEvent*> emap; 61 //LinkOwner<TimeEvent> flist; //unused elements for reuse 62 }; 63 64 } 65 66 #endif 67