HANDLE OpenWaitableTimer( DWORD Access, BOOL Inherit, LPCTSTR TimerName);
この関数はNT4.0以降で使用可能である。
引数の意味は、以下の通り。
Access | オープン時のアクセス指定。後述の表を参照。 |
Inherit | 返されたハンドルが継承可能か否か表す真偽値。 |
TimerName | オープンするタイマオブジェクト |
Accessに指定可能な値は、以下のフラグの組み合わせである。
TIMER_ALL_ACCESS | すべてのアクセスが可能。 |
TIMER_MODIFY_STATE | タイマの状態を変更可能。 |
SYNCHRONIZE | 待機関数で使用可能。 |
関数の実行に成功した場合、TimerNameで指定された名前のタイマオブジェクトをオープンし、そのハンドルを返す。失敗した場合、NULLが返される。
#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]); } li.QuadPart = -30000000; printf("開始\n"); SetWaitableTimer(hTimer, &li, 500, NULL, &li, FALSE); /* スレッドの終了まで待機 */ WaitForMultipleObjects(2, hThread, TRUE, INFINITE); /* 後処理 */ CloseHandle(hTimer); CloseHandle(hThread[0]); CloseHandle(hThread[1]); return(0); }