BOOL CancelWaitableTimer(HANDLE hTimer);
この関数はNT4.0以降で使用可能である。
無効化されたタイマオブジェクトを待機関数で参照する待機スレッドは、待機関数で指定されたタイムアウト時間経過後タイムアウトで解放される。無効化されているタイマオブジェクトを再び有効にするには、SetWaitableTimer関数を使用する。
引数の意味は、以下の通り。
| hTimer | 無効化するタイマオブジェクトを示すハンドル。 |
関数の実行に成功した場合、TRUEが返される。失敗した場合、FALSEが返される。
#define TIMERNAME "Test Timer Object"
/* スレッド用関数 */
DWORD WINAPI DoThread(DWORD ThreadCount)
{
HANDLE hTimer;
int i;
/* タイマオブジェクトのオープン */
hTimer = OpenWaitableTimer(TIMER_ALL_ACCESS, FALSE, TIMERNAME);
for(i=0; i<5; i++) {
/* 待機 */
WaitForSingleObject(hTimer, INFINITE);
/* 処理 */
printf("スレッド%d: 処理開始\n", ThreadCount);
Sleep(100);
printf("スレッド%d: 処理終了\n", ThreadCount);
}
/* 終了 */
CloseHandle(hTimer);
return(0);
}
int main(int argc, char **argv)
{
HANDLE hThread[2];
DWORD ThreadID[2];
HANDLE hTimer;
int i;
LARGE_INTEGER li;
/* タイマオブジェクトの初期化 */
hTimer = CreateWaitableTimer(NULL, FALSE, TIMERNAME);
/* スレッドを2つ作成 */
for(i=0; i<2; i++) {
hThread[i] = CreateThread(
NULL, 0, (LPTHREAD_START_ROUTINE)DoThread,
(LPVOID)i, 0, &ThreadID[i]);
}
printf("開始\n");
li.QuadPart = -30000000;
SetWaitableTimer(hTimer, &li, 500, NULL, &li, FALSE);
/* 4秒間処理を行う */
Sleep(4000);
printf("停止\n");
CancelWaitableTimer(hTimer);
/* 2秒間中断 */
Sleep(2000);
printf("再開\n");
li.QuadPart = 0;
SetWaitableTimer(hTimer, &li, 1000, DoCompletion, &li, FALSE);
/* スレッドの終了まで待機 */
WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
/* 後処理 */
CloseHandle(hTimer);
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
return(0);
}