完了ルーチンを使用した待機可能タイマの例(C言語)
サンプルコード:
/* スレッド用関数 */
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);
}
/* 完了ルーチン */
VOID APIENTRY TimerAPC(LPVOID Args, DWORD low, DWORD high)
{
printf("TimerAPC Executed.\n");
}
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]);
Sleep(1000);
}
li.QuadPart = 0;
SetWaitableTimer(hTimer, &li, 500, TimerAPC, &li, FALSE);
/* スレッドの終了まで待機 */
while(WaitForMultipleObjectsEx(2, hThread, TRUE, INFINITE, TRUE) == WAIT_IO_COMPLETION);
/* 後処理 */
CloseHandle(hTimer);
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
return(0);
}
(original text:1998/12/25 更新)
本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。