OpenEvent イベントオブジェクトのオープン

Cの宣言:

HANDLE OpenEvent(DWORD Access, BOOL Inherit, LPCTSTR EventName)

説明:

イベントオブジェクトをオープンする。

イベントオブジェクトを参照しているハンドルが全てクローズされると、イベントオブジェクトは自動的に破棄される。

引数の意味は、以下の通り。
Access オープンするイベントオブジェクトに対してどのようなアクセスを行うかを指定するフラグ。後述の表を参照。
Inherit 取得したハンドルが継承可能か否かを表す真偽値。
EventName オープンするイベントオブジェクトの名前。

Accessに指定可能な値は、以下の論理和である。
EVENT_MODIFY_STATE イベントの状態を変更可能とする。
SYNCHRONIZE 待機関数に使用可能。(NTのみ)
EVENT_ALL_ACCESS すべてのアクセスを可能とする。

OpenEventの実行に成功した場合、オープンしたイベントオブジェクトのハンドルを返す。実行に失敗した場合、NULLが返される。

C言語のサンプル:

#define EVENT_NAME "Event Object Test"

/* スレッド用関数
 * “処理”の部分が、排他的な処理となる
 * ThreadCount: 何番目のスレッドか
 */
DWORD WINAPI DoThread(DWORD ThreadCount)
{
	HANDLE hEvent;
	int i;

	hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, EVENT_NAME);

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

		/* 処理 */
		printf("スレッド%d: 処理開始\n", ThreadCount);
		Sleep(3000);
		printf("スレッド%d: 処理終了\n", ThreadCount);

		/* 開放 */
		SetEvent(hEvent);
	}
	
	CloseHandle(hEvent);
	return(0);
}

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

	hEvent = CreateEvent(NULL, FALSE, TRUE, EVENT_NAME);

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

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

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

	return(0);
}

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

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