CreateWaitableTimer 待機可能タイマの作成

Cの宣言:

HANDLE CreateWaitableTimer(
	LPSECURITY_ATTRIBUTES Security,
	BOOL ManualReset,
	LPCTSTR TimerName);

説明:

待機可能タイマを作成し、タイマオブジェクトのハンドルを返すする。TimerNameで指定された名前の待機可能タイマが既に存在する場合、これをオープンし、そのハンドルを返す。

この関数は、NT4.0以降で使用可能である。

待機可能タイマは、一定時間経過後一定時間間隔でシグナル状態となるオブジェクトである。呼び出し元はタイマオブジェクトに対して待機関数を使用することにより、周期的に行わなければならない処理を実装することができる。

待機可能タイマには、手動リセットタイマと自動リセットタイマがある。自動リセットタイマは待機関数が制御を戻した時点で、シグナル状態となるタイマオブジェクトである。手動リセットタイマは、待機関数が制御を戻した時点で自動的にシグナル状態となることはない。再びタイマオブジェクトを利用可能とするには、SetWaitableTimer関数を実行する。

待機可能タイマを参照するすべてのハンドルがクローズされたならば、自動的にタイマオブジェクトは破棄される。

CreateWaitableTimerによって作成されたタイマオブジェクトは、初期状態で無効な状態となっている。タイマオブジェクトを有効にするには、SetWaitableTimer関数を実行する。

引数の意味は、以下の通り。
Security セキュリティ属性へのポインタ。NULLを指定可能。
ManualReset TRUEの場合は手動リセットタイマ、FALSEの場合は自動リセットタイマが作成される。
TimerName 作成するタイマオブジェクトの名前。NULLを指定した場合、名前無しタイマオブジェクトが作成される。

関数の実行に成功した場合、タイマオブジェクトを示すハンドルが返される。タイマオブジェクトが新規に作成された場合、GetLastErrorの戻り値は0となり、既存のタイマオブジェクトをオープンした場合は、ERROR_ALREADY_EXISTSとなる。関数の実行に失敗した場合、NULLが返される。

Cのサンプル:

スレッド作成から3秒後以降に、0.5秒ごとにスレッドの処理を行う。
#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);
}

(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。