TNB Library
TnbSyncWaitableTimer.h
[詳解]
1#pragma once
13#include "TnbSync.h"
14
15
16
17#if ( _WIN32_WINNT >= 0x0400 ) || ( _WIN32_WINDOWS > 0x0400 )
18#else
19 #error Reason "This class cannot be used by the target OS."
20#endif
21
22
23
24//T-TestCaseコードカバレッジDisable
25#pragma comment(user,"T-Coverage Disable")
26
27
28
29//TNB Library
30namespace TNB
31{
32
33
34
87{
88 HANDLE m_hTimer;
89
90public:
91
100 explicit CSyncWaitableTimer(bool boIsManualReset = false, LPCTSTR lpszName = NULL)
101 {
102 m_hTimer = ::CreateWaitableTimer(NULL, boIsManualReset, lpszName);
103 ASSERT0(
104 m_hTimer != NULL,
105 "CSyncWaitableTimer::CSyncWaitableTimer()",
106 "WaitableTimerが初期化できませんした。名前に問題がある可能性が有ります。"
107 );
108 if ( m_hTimer == NULL )
109 {
111 }
112 ::CancelWaitableTimer(m_hTimer);
113 }
114
119 explicit CSyncWaitableTimer(HANDLE hTimer)
120 {
121 VERIFY( m_hTimer = hTimer );
122 }
123
126 {
127 if ( m_hTimer != NULL )
128 {
129 ::CloseHandle(m_hTimer);
130 }
131 }
132
137 virtual HANDLE GetHandle(void) const
138 {
139 return m_hTimer;
140 }
141
147 virtual void Unlock(void) const
148 {
149 // なにもしない
150 }
151
161 bool Start(DWORD dwLagTime, DWORD dwInterval)
162 {
163 if ( m_hTimer != NULL )
164 {
165 LARGE_INTEGER li;
166 li.QuadPart = dwLagTime;
167 li.QuadPart *= -10000;
168 return !! ::SetWaitableTimer(m_hTimer, &li, dwInterval, NULL, 0, FALSE);
169 }
170 return false;
171 }
172
177 void ToLock(void)
178 {
179 if ( m_hTimer != NULL )
180 {
181 ::CancelWaitableTimer(m_hTimer);
182 }
183 }
184};
185
186
187
188}; // TNB
189
190
191
192//T-TestCaseコードカバレッジEnable
193#pragma comment(user,"T-Coverage Enable")
194
195
196#if 0
197static CSyncWaitableTimer s_timer;
198
199DWORD WINAPI DoThread(DWORD ThreadCount)
200{
201 for (int i=0;i<5;i++)
202 {
203 EXCLUSIVE(&s_timer);
204 TRACE1("スレッド%d: 処理開始\n", ThreadCount);
205 Sleep(400*ThreadCount);
206 TRACE1("スレッド%d: 処理終了\n", ThreadCount);
207 }
208 return 0;
209}
210
211void ____wt()
212{
213 HANDLE hThread[2];
214 DWORD ThreadID[2];
215 /* スレッドを2つ作成 */
216 for (int i=0; i<2; i++)
217 {
218 hThread[i] = CreateThread(
219 NULL, 0, (LPTHREAD_START_ROUTINE)DoThread,
220 (LPVOID)i,0,&ThreadID[i]);
221 }
222 TRACE0("開始\n");
223 s_timer.Start(1000,1000);
224 WaitForMultipleObjects(2, hThread, TRUE, INFINITE);// スレッドの終了まで待機
225 CloseHandle(hThread[0]);
226 CloseHandle(hThread[1]);
227
228 typedef LONG (WINAPI *P_InterlockedCompareExchange)(LONG*,LONG,LONG);
229 typedef HANDLE (WINAPI *P_IcmpCreateFile)(VOID);
230 HANDLE h = CDynamicFuncT<P_IcmpCreateFile>("ICMP.dll","IcmpCreateFile")()();
231
232 CDynamicFuncT<P_InterlockedCompareExchange> func1("kernel32.dll","InterlockedCompareExchange");
233 LONG l1 = 0;
234 LONG l2 = func1()(&l1,1,0);
235}
236#endif
同期処理関係のヘッダ
HANDLE型排他抽象クラス
Definition: TnbSync.h:67
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
動的関数管理クラステンプレート
パラメータ不正例外
Definition: TnbException.h:159
WaitableTimer排他管理クラス
CSyncWaitableTimer(bool boIsManualReset=false, LPCTSTR lpszName=NULL)
コンストラクタ
void ToLock(void)
[排他] ロック状態にする.
CSyncWaitableTimer(HANDLE hTimer)
コンストラクタ
bool Start(DWORD dwLagTime, DWORD dwInterval)
[排他] 開始
virtual HANDLE GetHandle(void) const
[取得] ハンドル取得
virtual void Unlock(void) const
[排他] アンロック.
virtual ~CSyncWaitableTimer(void)
デストラクタ
#define EXCLUSIVE(CLS)
簡易排他制御マクロ.
Definition: TnbSync.h:788
TNB Library
Definition: TnbDoxyTitle.txt:2