TNB Library
TnbTimerDispatch.h
[詳解]
1#pragma once
13#include "TnbThreadDispatch.h"
14
15
16
17//TNB Library
18namespace TNB
19{
20
21
22
43{
44public:
45
59 struct IListener
60 {
62 virtual ~IListener(void) {}
63
74 virtual bool OnTimer(UINT_PTR uTimerId, LPARAM lParam, const CTimerDispatch& timer) = 0;
75
80 virtual void OnSetup(void) {}
81 };
82
83private:
84
85 #ifndef _TnbDOXYGEN //Document作成用シンボル
86
88 enum
89 {
90 WMTT_SETTIMER = WM_APP,
91 WMTT_KILLTIMER = WM_APP + 1,
92 };
93
95 struct TParam
96 {
97 UINT_PTR uTimerId;
98 UINT uElapse;
99 LPARAM lParam;
100 CSyncEvent eventSuccess;
102 TParam(UINT uEla, LPARAM lp) : uTimerId(0), uElapse(uEla), lParam(lp)
103 {
104 eventSuccess.ToLock();
105 }
106 };
107
109 class CListener : public CThreadDispatch::IListener
110 {
111 DEFPARENTLISTENER(CTimerDispatch, IParentListener);
112 public:
113
115 void Set(CTimerDispatch* P, IParentListener* I)
116 {
117 m_pcTimer = P;
118 m_piListener = I;
119 }
120
121 private:
123 virtual bool OnThreadDispatchReceive(UINT nMsg, WPARAM wParam, LPARAM lParam)
124 {
125 switch ( nMsg )
126 {
127 case WMTT_SETTIMER:
128 {
129 TParam* P = reinterpret_cast<TParam*>(lParam);
130 UINT_PTR i = ::SetTimer(NULL, 0, P->uElapse, reinterpret_cast<TIMERPROC>(P->lParam));
131 ASSERT(i != 0);
132 P->uTimerId = i;
133 P->eventSuccess.Unlock();
134 }
135 break;
136 case WMTT_KILLTIMER:
137 ::KillTimer(NULL, lParam);
138 break;
139 case WM_TIMER:
140 ASSERTLIB(m_piListener != NULL);
141 ASSERTLIB(m_pcTimer != NULL);
142 return m_piListener->OnTimer(wParam, lParam, *m_pcTimer);
143 break;
144 default:
145 break;
146 }
147 return true;
148 }
150 virtual void OnThreadDispatchSetup(void)
151 {
152 ASSERTLIB(m_piListener != NULL);
153 m_piListener->OnSetup();
154 }
155 IParentListener* m_piListener;
156 CTimerDispatch* m_pcTimer;
157 };
158
159 friend class CTimerDispatch::CListener;
160 CThreadDispatch m_dispatch;
161 CListener m_listener;
162
164 struct TDefaultListener : IListener
165 {
166 virtual bool OnTimer(UINT_PTR uTimerId, LPARAM lParam, const CTimerDispatch& timer)
167 {
168 return const_cast<CTimerDispatch&>(timer).OnTimer(uTimerId, lParam);
169 }
170 } m_lisDef;
171
172 #endif //_TnbDOXYGEN
173
174public:
175
178 {
179 m_listener.Set(this, &m_lisDef);
180 m_dispatch.SetListener(&m_listener);
181 }
182
184 virtual ~CTimerDispatch(void)
185 {
186 Stop();
187 }
188
196 {
197 m_listener.Set(this, (P != NULL) ? P : &m_lisDef);
198 }
199
206 bool Start(LPCTSTR lpszName = NULL)
207 {
208 #ifdef _DEBUG
209 if ( lpszName == NULL) { lpszName = _T("TimerDispatch:MessagePump"); }
210 #endif
211 return m_dispatch.Start(lpszName);
212 }
213
219 bool Stop(void)
220 {
221 return m_dispatch.Stop();
222 }
223
231 UINT_PTR SetTimer(UINT uElapse, LPARAM lParam = 0) const
232 {
233 if ( m_dispatch.GetThreadId() == ::GetCurrentThreadId() )
234 {
235 return ::SetTimer(NULL, 0, uElapse, reinterpret_cast<TIMERPROC>(lParam));
236 }
237 TParam t(uElapse, lParam);
238 if ( m_dispatch.PostMessage(WMTT_SETTIMER, 0, reinterpret_cast<LPARAM>(&t)) )
239 {
240 t.eventSuccess.Lock(); //Post先の処理が終わるのを待つ
241 return t.uTimerId; //Post先で値を入れてくれている
242 }
243 return 0;
244 }
245
252 bool KillTimer(UINT_PTR uTimerId) const
253 {
254 if ( m_dispatch.GetThreadId() == ::GetCurrentThreadId() )
255 {
256 return !! ::KillTimer(NULL, uTimerId);
257 }
258 return m_dispatch.PostMessage(WMTT_KILLTIMER, 0, uTimerId);
259 }
260
266 {
267 return m_dispatch.ReferThreadStatus();
268 }
269
282 virtual bool OnTimer(UINT_PTR uTimerId, LPARAM lParam)
283 {
284 ASSERT0(false, "CTimerDispatch", "継承もリスナ登録も行われずに使用されています。");
285 return false;
286 }
287
288private:
289 friend class CTimerDispatchTest;
290};
291
292
293
294};//TNB
スレッド処理関係のヘッダ
Event排他管理クラス
Definition: TnbSync.h:480
void ToLock(void)
[排他] ロック状態にする
Definition: TnbSync.h:544
スレッド処理制御クラス
CThreadStatus & ReferThreadStatus(void)
[参照] 処理スレッド状態参照.
bool PostMessage(UINT nMsg, WPARAM wParam=0, LPARAM lParam=0) const
[設定] スレッドへPostMessage
void SetListener(IListener *piListener)
[登録] リスナー登録
bool Start(LPCTSTR lpszName=NULL)
[設定] スレッド開始
DWORD GetThreadId(void) const
[取得] スレッドのID取得
bool Stop(void)
[設定] スレッド停止
スレッド状態管理クラス
Definition: TnbThread.h:128
タイマー処理クラス
CThreadStatus & ReferThreadStatus(void)
[参照] 処理スレッド状態参照.
void SetListener(IListener *P)
[登録] リスナー登録
virtual ~CTimerDispatch(void)
デストラクタ
virtual bool OnTimer(UINT_PTR uTimerId, LPARAM lParam)
[通知] タイマー発生.
UINT_PTR SetTimer(UINT uElapse, LPARAM lParam=0) const
[設定] タイマーセット
bool Start(LPCTSTR lpszName=NULL)
[設定] スレッド開始
CTimerDispatch(void)
コンストラクタ
bool KillTimer(UINT_PTR uTimerId) const
[設定] タイマー破棄
bool Stop(void)
[設定] スレッド停止
TNB Library
Definition: TnbDoxyTitle.txt:2
スレッド処理制御のリスナーインターフェース
タイマー処理のリスナーインターフェース
virtual ~IListener(void)
デストラクタ
virtual bool OnTimer(UINT_PTR uTimerId, LPARAM lParam, const CTimerDispatch &timer)=0
[通知] タイマー発生.
virtual void OnSetup(void)
[通知] 開始通知.