ResetEvent イベントオブジェクトを非シグナル状態にする

C言語の宣言:

BOOL ResetEvent(HANDLE hEvent);

説明:

イベントオブジェクトを非シグナル状態にする。

引数の意味は以下の通り。
hEvent 非シグナル状態にするイベントオブジェクトを示すハンドル。

ResetEventの実行に成功した場合、TRUEが返される。実行に失敗した場合、FALSEが返される。

Cのサンプル:

ある処理を繰り返し行う2つのスレッドがある。メインの処理中で優先度の高い処理を行わなければならなくなったときに、手動リセットイベントオブジェクトを非シグナル状態にすることによって、スレッドが新規に処理を開始するのを一時的に妨げる。メインの優先度の高い処理が終了したら、イベントオブジェクトを再びシグナル状態にすることによって、スレッドの処理を再開させる。
#define EVENT_NAME "Event Object Test"

/* スレッド用関数 */
DWORD WINAPI DoThread(DWORD ThreadCount)
{
	HANDLE hEvent;
	int i;

	hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, EVENT_NAME);

	for(i=0; i<15; i++) {
		/* 所有権獲得まで待機 */
		WaitForSingleObject(hEvent, INFINITE);

		/* 処理 */
		printf("スレッド%d: 処理開始\n", ThreadCount);
		Sleep(1000);
		printf("スレッド%d: 処理終了\n", ThreadCount);
	}
	
	CloseHandle(hEvent);
	return(0);
}

/* メイン関数 */
int main(int argc, char **argv)
{
	HANDLE hThread[2];
	HANDLE hEvent;
	int i;

	/* イベントオブジェクトの作成 */
	hEvent = CreateEvent(NULL, TRUE, TRUE, EVENT_NAME);

	/* スレッドを2つ作成 */
	for(i=0; i<2; i++) {
		hThread[i] = CreateThread(
			NULL, 0, (LPTHREAD_START_ROUTINE)DoThread,
			(LPVOID)i, 0, NULL);
		Sleep(500);
	}

	Sleep(5000);

	/* スレッドの実行を約5秒間中断 */
	ResetEvent(hEvent);
	printf("スレッドの処理開始を一時禁止\n");

	/* 優先度の高い処理 */
	Sleep(5000);

	printf("スレッドの処理開始を再び許可\n");
	SetEvent(hEvent);

	/* スレッドの終了まで待機 */
	WaitForMultipleObjects(2, hThread, TRUE, INFINITE);

	/* 後処理 */
	CloseHandle(hEvent);
	CloseHandle(hThread[0]);
	CloseHandle(hThread[1]);

	return(0);
}
(original text:1998/12/25 更新)

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