File: UTILS\U_TIMER.CPP
1 //#############################################################################
2 // //
3 // U_TIMER.CPP //
4 // Subsystem: Utilities - Timer //
5 // Deklaration: U_TIMER.H //
6 //---------------------------------------------------------------------------//
7 // Autoren: Thomas Kullmann, Günther Reinecker //
8 // Stand: 01.12.2002 //
9 // //
10 //#############################################################################
11
12 #include <stdlib.h> // für: min(), max()
13
14 #include "utils\u_timer.h" // SCHNITTSTELLE für diese Datei
15
16 //--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--
17
18 //##############################################################################
19 // TBasicTimer //
20 //##############################################################################
21
22 TBasicTimer::TBasicTimer ( const UINT aDelay )
23 {
24 //Intervallgrenzen ermitteln
25 if (timeGetDevCaps( &m_Tc, sizeof( TIMECAPS ) ) != TIMERR_NOERROR)
26 {
27 m_Tc.wPeriodMin= 0;
28 m_Tc.wPeriodMax= 0;
29 }
30
31 m_Delay= max( m_Tc.wPeriodMin, min( aDelay, m_Tc.wPeriodMax )); //ggf. 0 !!!
32 m_WantTimer= FALSE;
33 };
34
35 //------------------------------------------------------------------------------
36
37 UINT TBasicTimer::GetDelay ( void )
38 {
39 return m_Delay;
40 };
41 //------------------------------------------------------------------------------
42
43 UINT TBasicTimer::SetDelay ( const UINT aDelay )
44 {
45 if ( m_Delay )
46 return 0; //wenn Intervallgrenzen nicht ermittelt werden konnten
47
48 m_Delay= max( m_Tc.wPeriodMin, min( aDelay, m_Tc.wPeriodMax ) ); //Sollintervall ins Intervall einpassen
49 return m_Delay;
50 };
51 //******************************************************************************
52 // start/ stop
53 //******************************************************************************
54
55 BOOL TBasicTimer::StartTimer ( const UINT aDelay )
56 {
57 SetDelay(aDelay);
58 return StartTimer();
59 };
60 //------------------------------------------------------------------------------
61
62 BOOL TBasicTimer::StartTimer ( void )
63 {
64 m_WantTimer= Start();
65 return m_WantTimer;
66 };
67 //------------------------------------------------------------------------------
68
69 void TBasicTimer::StopTimer ( void )
70 {
71 Stop();
72 m_WantTimer= FALSE;
73 };
74
75 //******************************************************************************
76 // start/ stop ( + Ereignis sofort auslösen)
77 //******************************************************************************
78
79 BOOL TBasicTimer::StartTimerIm ( void )
80 {
81 BOOL result= StartTimer();
82 Immediately(); // auch aufrufen, wenn Timer nicht gestartet werden konnte
83 return result;
84 };
85 //------------------------------------------------------------------------------
86
87 BOOL TBasicTimer::StartTimerIm ( const UINT aDelay)
88 {
89 BOOL result= StartTimer(aDelay);
90 Immediately(); // auch aufrufen, wenn Timer nicht gestartet werden konnte
91 return result;
92 };
93 //------------------------------------------------------------------------------
94
95 void TBasicTimer::StopTimerIm ( void )
96 {
97 m_WantTimer= FALSE; // bei Immediately nicht neu starten
98 Immediately();
99 StopTimer();
100 };
101 //------------------------------------------------------------------------------
102
103 void TBasicTimer::Immediately ( void )
104 {
105 Stop();
106 OnTimer(this);
107 if ( m_WantTimer )
108 Start(); //könnte in OnTimer FALSE gesetzt worden sein
109 };
110
111 //##############################################################################
112 // TTimer16 //
113 //##############################################################################
114
115 TIndList TTimer16::s_TimerList(true, true, false, true);
116
117 //------------------------------------------------------------------------------
118
119 TTimer16::TTimer16 ( const UINT aDelay ) : TBasicTimer( aDelay )
120 {
121 m_TimerID= 0; //bislang nicht gestartet
122 };
123 //------------------------------------------------------------------------------
124
125 TTimer16::~TTimer16 ( void )
126 {
127 StopTimer(); //Timer stoppen
128 };
129 //------------------------------------------------------------------------------
130
131 BOOL TTimer16::IsStarted ( void )
132 {
133 return (m_TimerID != 0);
134 };
135 //------------------------------------------------------------------------------
136
137 BOOL TTimer16::Start ( void )
138 {
139 if ( m_Delay == 0 )
140 return FALSE; //wenn Intervallgrenzen nicht ermittelt werden konnten
141
142 Stop(); // alten Timer stoppen
143 m_TimerID= SetTimer( NULL, 123, m_Delay, (TIMERPROC) & TTimer16::TimedEvent );
144 if ( !IsStarted() )
145 return FALSE;
146
147 // zur Liste der gestarteten Timer hinzufügen
148 s_TimerList.Append(this);
149 return TRUE;
150 };
151 //------------------------------------------------------------------------------
152
153 void TTimer16::Stop ( void )
154 {
155 if ( !IsStarted() )
156 return;
157
158 KillTimer( NULL, m_TimerID );
159 m_TimerID= NULL; // Timer ist gestoppt
160 // aus der Liste der gestarteten Timer entfernen
161 s_TimerList.RemoveData(this);
162 };
163 //------------------------------------------------------------------------------
164
165 void CALLBACK TTimer16::TimedEvent ( HWND, UINT, UINT aTimerID, DWORD )
166 {
167 // Objekt aus der Liste der gestarteten Timer ermitteln; damit endlich auch Zugriff auf Member
168 TTimer16 *self= 0;
169 for (TIndex i= 0; (i<s_TimerList.GetCount() && !self ); i++) {
170 TTimer16 *act= (TTimer16 *)s_TimerList[i];
171 if ( act && act->m_TimerID==aTimerID ) self= act; // gefunden :-)
172 }
173 if ( !self ) { // nicht in der Liste :-(
174 const char prae[]= "Unbekannte TIMER-Botschaft für ID= %d !";
175 char *buf= new char[ strlen(prae) + _MAXLENDOUBLE + 1 ];
176 sprintf(buf, prae, aTimerID);
177 TraceErr(buf);
178 _FREELIST(buf);
179 return;
180 }
181
182 self->Stop();
183 self->OnTimer( self );
184 if ( self->m_WantTimer )
185 self->Start(); // <m_WantTimer> könnte in OnTimer FALSE gesetzt worden sein
186 };
187
188 //##############################################################################
189 // TTimerMM //
190 //##############################################################################
191
192 TTimerMM::TTimerMM ( const UINT aDelay ) : TBasicTimer( aDelay )
193 {
194 m_TimerID= 0; //bislang nicht gestartet
195 };
196 //------------------------------------------------------------------------------
197
198 TTimerMM::~TTimerMM ( void )
199 {
200 StopTimer(); //Timer stoppen
201 };
202 //------------------------------------------------------------------------------
203
204 BOOL TTimerMM::IsStarted ( void )
205 {
206 return (m_TimerID != 0);
207 };
208 //------------------------------------------------------------------------------
209
210 BOOL TTimerMM::Start ( void )
211 {
212 if ( m_Delay == 0 )
213 return FALSE; //wenn Intervallgrenzen nicht ermittelt werden konnten
214
215 StopTimer(); //Timer stoppen
216 m_TimerID= timeSetEvent( m_Delay, m_Tc.wPeriodMin, &TTimerMM::TimedEvent, (DWORD)this, TIME_PERIODIC ); //gibt 0 zurück, falls Timer nict gestartet werden konnte
217 return IsStarted();
218 };
219 //------------------------------------------------------------------------------
220
221 void TTimerMM::Stop ( void )
222 {
223 if ( IsStarted() )
224 timeKillEvent( m_TimerID );
225 m_TimerID= 0; //Timer ist gestoppt
226 };
227 //------------------------------------------------------------------------------
228
229 void CALLBACK TTimerMM::TimedEvent ( UINT, UINT, DWORD dwUser, DWORD, DWORD )
230 {
231 TTimerMM *self= (TTimerMM*)dwUser; //damit endlich auch Zugriff auf Member
232
233 self->Stop();
234 self->OnTimer( self ); //solange diese Methode rechnet, kann OnTimer nicht erneut aufgerufen werden: deshalb Timer stoppen und neu starten
235 if ( self->m_WantTimer )
236 self->Start(); //könnte in OnTimer FALSE gesetzt worden sein
237 };
238
239 //##############################################################################
240 // TInterfaceTimer
241 //##############################################################################
242
243 TInterfaceTimer::TInterfaceTimer ( ITimer *aInterface, const UINT aDelay ) : TTimer( aDelay )
244 {
245 m_lnkInterface= aInterface;
246 };
247 //------------------------------------------------------------------------------
248
249 void TInterfaceTimer::OnTimer ( TBasicTimer *const aTimer )
250 {
251 if ( m_lnkInterface )
252 m_lnkInterface->OnTimer(aTimer);
253 };
254
255 //##############################################################################
256 // TWindowTimer
257 //##############################################################################
258
259 TWindowTimer::TWindowTimer ( HWND aWnd, const UINT aDelay ) : TTimer( aDelay )
260 {
261 m_lnkWnd= aWnd;
262 };
263 //------------------------------------------------------------------------------
264
265 void TWindowTimer::OnTimer ( TBasicTimer *const )
266 {
267 if ( m_lnkWnd )
268 SendMessage( m_lnkWnd, WM_TIMER, 0, 0 ); //wartet solange bis die Botschaft verarbeitet wurde
269 };
270
271 //##############################################################################
272 // LASTLINE
273 //##############################################################################
274