WaitForSingleObject

指定されたカーネルオブジェクトがシグナル状態になるか、指定された時間が経過するまでスレッドを待機させます。

DWORD WaitForSingleObject(
    HANDLE hHandle,        // object handle
    DWORD  dwMilliseconds  // time-out interval
);

KERNEL32.DLL

引数

hHandle

オブジェクトのハンドルを指定します。

待機が未完了の状態でこのハンドルがクローズされた場合の動作は未定義です。

このハンドルはSYNCHRONIZEアクセスを持っていなければなりません。

dwMilliseconds

タイムアウト時間をミリ秒単位で指定します。この時間が経過した場合、オブジェクト状態が非シグナル状態であっても、関数は制御を返します。0を指定すると、オブジェクトがシグナル状態かどうかを調べて直ちに制御を返します。0xFFFFFFFF (INFINITE) を指定すると、オブジェクトがシグナル状態になるまで無限に待機し続けます。

戻り値

以下の値のいずれかを返します。

0x00000000 (WAIT_OBJECT_0)

オブジェクトがシグナル状態になったことを示します。

0x00000080 (WAIT_ABANDONED)

指定されたオブジェクトがミューテックスオブジェクトであり、それを所有していたスレッドが終了する前にミューテックスオブジェクトが解放されなかったことを示します。ミューテックスオブジェクトの所有権は呼び出し側スレッドに与えられ、ミューテックスは非シグナル状態に設定されます。

ミューテックスが永続的な状態情報を保護している場合には、整合性を保つためにこの戻り値を確認すべきです。

0x00000102 (WAIT_TIMEOUT)

タイムアウト時間が経過したことを示します。

0xFFFFFFFF (WAIT_FAILED)

エラーが発生したことを示します。拡張エラー情報を取得するには、GetLastError関数を使います。

解説

WaitForSingleObject関数は、指定されたオブジェクトの現在の状態をチェックします。オブジェクトが非シグナル状態の場合は、オブジェクトがシグナル状態になるかタイムアウト時間が経過するまで、呼び出しスレッドは待機状態となります。

この半数はいくつかの同期オブジェクトの状態を変更します。オブジェクトがシグナル状態になったことによって関数が制御を介した場合にのみ、そのオブジェクトに対する変更が発生します。例えば、セマフォオブジェクトの参照カウントが1だけ減らされます。

この関数のhHandleパラメータには、以下のカーネルオブジェクトのハンドルを指定することができます。

待機関数およびウィンドウを直接または間接的に作成するコードを呼び出す際には注意が必要です。スレッドがウィンドウを作成する場合、スレッドはメッセージを処理しなければいけません。メッセージブロードキャストはシステムのすべてのウィンドウに送信されます。タイムアウト時間を指定せずに(INFINITEを指定して)待機関数を使用するスレッドが、システムをデッドロック状態に陥らせる可能性があります。間接的にウィンドウを作成するコードの例として、DDEやCoInitialize関数があります。そのため、スレッドがウィンドウを作成する場合は、MsgWaitForMultipleObjectsまたはMsgWaitForMultipleObjectsEx関数を使用します。

対応情報

Windows 95 以降 / Windows NT 3.1 以降