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