<Return[WXYZ]><Top>

WaitForSingleObjectEx

Declare Function Api_WaitForSingleObjectEx& Lib "kernel32" Alias "WaitForSingleObjectEx" (ByVal hHandle&, ByVal dwMilliseconds&, ByVal bAlertable&)

Declare Function WaitForSingleObjectEx Lib "kernel32" Alias "WaitForSingleObjectEx" (ByVal hHandle As Long, ByVal dwMilliseconds As Long, ByVal bAlertable As Long) As Long

次のいずれかの状態になると、制御を返す。
•指定されたオブジェクトがシグナル状態になった。
•I/O 完了ルーチンまたは APC(非同期プロシージャコール)がスレッドのキューに置かれた。
•タイムアウト時間が経過した。
複数のオブジェクトを待機するには、WaitForMultipleObjectsEx 関数を使う。

パラメータ
hHandle
    オブジェクトのハンドルを指定する。
    ハンドルが待機状態で未処理になっているときに、そのハンドルを閉じた場合、この関数の動作は未定義である。
    Windows NT/2000:このハンドルに、SYNCHRONIZE アクセス権を割り当てておかなければならない。
dwMilliseconds
    タイムアウト時間を、ミリ秒(ms)単位で指定する。タイムアウト時間が経過すると、オブジェクトがシグナル状態になっていなくても、また、

    I/O 完了ルーチンや APC がキューに置かれていなくても、制御が返る。0 を指定すると、この関数はオブジェクトの状態を調べ、I/O 完了

    ルーチンや APC がキューに置かれているかどうかをチェックし、即座に制御を返す。INFINITE を指定すると、条件が満たされるまで待機

    し続ける。
bAlertable
    システムが I/O 完了ルーチンや APC をキューに置いたときに、この関数が制御を返すかどうかを指定する。TRUE を指定すると、制御が

    返り、その I/O 完了ルーチンや APC 関数が実行される。FALSE を指定すると、制御は返らず、その I/O 完了ルーチンや APC 関数も実

    行されない。
    完了ルーチンを指定した 関数や 関数が完了すると、その完了ルーチンがキューに置かれる。bAlertable パラメータで TRUE を指定し、呼

    び出し側スレッドと読み書き操作を開始したスレッドが同じ場合にのみ、その完了ルーチンが呼び出される。QueueUserAPC 関数を呼び出

    すと、APC がキューに置かれる。

戻り値
    関数が成功すると、関数が制御を返した原因が返る。次の値のいずれかになる。

    値                                     

意味                                                                                                                                        

    WAIT_ABANDONED

 

 

指定されたオブジェクトは、放棄されたミューテックスオブジェクトである(あるスレッドが所有権を持っていました

が、そのスレッドは所有権を解放しないで終了した)。この関数を呼び出した結果、そのミューテックスオブジェクトの所有権は呼び出し側スレッドに移り、そのミューテックスは非シグナル状態に設定された。

    WAIT_IO_COMPLETION

1 つまたは複数の I/O 完了ルーチンが、実行の目的でキューに置かれている。

    WAIT_OBJECT_0

指定したオブジェクトがシグナル状態になったことを意味する。

    WAIT_TIMEOUT

タイムアウト時間が経過し、指定されたオブジェクトが非シグナル状態であったことを意味する。

    関数が失敗すると、-1 が返る。拡張エラー情報を取得するには、 関数を使う。

 

解説
    WaitForSingleObjectEx 関数は、指定されたオブジェクトの現在の状態をチェックする。そのオブジェクトが非シグナル状態である場合、呼

    び出し側スレッドは待機状態に入る。条件が満たされるのを待機している間、そのスレッドはプロセッサ時間を消費しない。
    この関数は、特定のタイプの同期オブジェクトの状態を変更する。指定されたオブジェクトがシグナル状態になり、それが原因で関数が制御

    を返した場合にのみ、そのオブジェクトに変更を加える。たとえば、セマフォオブジェクトのカウントを 1 つ減らす。
    この関数は、次のオブジェクトを待機することができる。
        •変更の通知
        •コンソール入力
        •イベント
        •ジョブ
        •ミューテックス
        •プロセス
        •セマフォ
        •スレッド
        •待機可能なタイマ
    この待機関数と、ウィンドウを直接的または間接的に作成するコードを組み合わせて使う場合は、注意が必要である。1 つのスレッドがウィ

    ンドウを作成した場合、そのスレッドはそのウィンドウに関係するメッセージを処理しなければなりません。また、メッセージのブロードキャスト

    (同報送信)が発生した場合、システム内のすべてのウィンドウへそのメッセージが送信される。タイムアウト時間として INFINITE を指定し

    て待機関数を呼び出していた場合、このような現象が発生すると、システムはデッドロック状態に陥ることがある。ウィンドウを間接的に作成

    する 2 つの例として、DDE と COM の CoInitialize がある。そのため、ウィンドウを作成するスレッドでは、WaitForSingleObjectEx 関数

    ではなく、MsgWaitForMultipleObjects または MsgWaitForMultipleObjectsEx 関数を使う。