]> git.tdb.fi Git - libs/core.git/blob - source/time/timer.h
Rename to libmspcore
[libs/core.git] / source / time / timer.h
1 /*
2 This file is part of libmspframework     
3 Copyright © 2006  Mikko Rasa, Mikkosoft Productions
4 Distributed under the LGPL
5 */
6 #ifndef MSP_TIME_TIMER_H_
7 #define MSP_TIME_TIMER_H_
8
9 #include <set>
10 #include <sigc++/sigc++.h>
11 #include "../core/mutex.h"
12 #include "../core/semaphore.h"
13 #include "../core/thread.h"
14 #include "timedelta.h"
15 #include "timestamp.h"
16
17 namespace Msp {
18 namespace Time {
19
20 /**
21 A class for executing functions periodically.  Every time the timeout is
22 reached, signal_timeout will be emitted.  If the functor connected to this
23 signal returns true, the timer is rescheduled by incrementing the timeout
24 by the interval.  Otherwise the timer is canceled.
25
26 A separate thread is used for running the timers.  All signal emissions will
27 happen in this thread - be careful with your variables.
28 */
29 class Timer
30 {
31 public:
32         sigc::signal<bool> signal_timeout;
33
34         Timer(const Time::TimeDelta &);
35         const Time::TimeStamp &get_timeout() const { return timeout; }
36         ~Timer();
37 private:
38         /**
39         A thread to run the timers independently of the rest of the program.
40         */
41         class Thread: public Msp::Thread
42         {
43         public:
44                 Thread();
45                 void nudge();
46                 void finish();
47         private:
48                 bool done;
49                 Semaphore sem;
50
51                 void main();
52         };
53
54         /**
55         Proxy class to handle automatic starting and termination of the thread.
56         */
57         class ThreadProxy
58         {
59         public:
60                 ThreadProxy(): thread(0) { }
61                 void nudge();
62                 ~ThreadProxy();
63         private:
64                 Thread *thread;
65         };
66
67         Time::TimeDelta interval;
68         Time::TimeStamp timeout;
69
70         static ThreadProxy thread;
71         static Mutex       set_mutex;
72         static std::set<Timer *> timers;
73 };
74
75 } // namespace Time
76 } // namespace Msp
77
78 #endif