<Return[WXYZ]><Top>

WaitForMultipleObjectsEx

Declare Function Api_WaitForMultipleObjectsEx& Lib "kernel32" Alias "WaitForMultipleObjectsEx" (ByVal nCount&, lpHandles&, ByVal bWaitAll&, ByVal dwMilliseconds&, ByVal bAlertable&)

Declare Function WaitForMultipleObjectsEx Lib "kernel32" Alias "WaitForMultipleObjectsEx" (ByVal nCount As Long, lpHandles As Long, ByVal bWaitAll As Long, ByVal dwMilliseconds As Long, ByVal bAlertable As Long) As Long

指定されたオブジェクトがシグナル状態になるか、I/O 完了ルーチンまたは APC がスレッドのキューに置かれたか、またはタイムアウト時間が経過すると制御を返す。

パラメータ
nCount
    lpHandles パラメータが指す配列内のオブジェクトハンドルの数を指定する。オブジェクトハンドルの最大数は、

    MAXIMUM_WAIT_OBJECTS である。
lpHandles
    複数のオブジェクトハンドルからなる 1 つの配列へのポインタを指定する。この配列には、異なるタイプのオブジェクトのハンドルを格納すること

    もできる。しかし、同じハンドルの複数のコピーを格納することはできない。
    いずれかのハンドルが待機状態で未処理になっているときに、そのハンドルを閉じた場合、この関数の動作は未定義である。
    Windows NT/2000:このハンドルに、SYNCHRONIZE アクセス権を割り当てておかなければならない。
    Windows 95:DuplicateHandle 関数を使って任意のハンドルを複製した場合、複製先のハンドルをこの関数で使うことはできない。
fWaitAll
    待機のタイプを指定する。TRUE を指定すると、lpHandles 配列内のすべてのオブジェクトがシグナル状態になったときに制御が返る。

    FALSE を指定すると、lpHandles 配列内のオブジェクトのどれか 1 つがシグナル状態になったときに制御が返る。この場合、戻り値は、

    関数が制御を返す状況をもたらした(つまり、シグナル状態になった)オブジェクトを表す。
dwMilliseconds
    タイムアウト時間を、ミリ秒(ms)単位で指定する。タイムアウト時間が経過すると、fWaitAll パラメータで指定した条件が満たされていなくて

    も、また、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_OBJECT_0 以上(WAIT_OBJECT_0 + nCount − 1)以下

fWaitAll が TRUE の場合、指定されたすべてのオブ

 

ジェクトがシグナル状態になったことを意味する。
fWaitAll が FALSE の場合、lpHandles パラメータ内で(戻り値 - WAIT_OBJECT_0)番目のオブジェ

クトが待機条件を満たしたことを意味する。この関数を呼び出して実行している間に複数のオブジェクトがシ

グナル状態になった場合は、それらのオブジェクトのうち、最小のインデックス番号が返る。

    WAIT_ABANDONED_0 以上 WAIT_ABANDONED_0 + nCount - 1)以下

fWaitAll が TRUE の場合、指定されたすべてのオブ

 

ジェクトがシグナル状態になったこと、およびこれらのオブジェクトのうち、少なくとも 1 つが、放棄されたミュ

ーテックスオブジェクト(あるスレッドが所有権を持っていたが、そのスレッドは所有権を解放しないで終了し

た)であったことを意味する。
fWaitAll が FALSE の場合、lpHandles パラメータ内の(戻り値 - WAIT_ABANDONED_0)番目のオ

ブジェクトが、待機条件を満たした、放棄されたミューテックスオブジェクトであったことを意味する。

    WAIT_TIMEOUT

タイムアウト時間が経過し、fWaitAll パラメータで指定された条件が満たされていないことを意味する。

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

 

解説
    WaitForMultipleObjectsEx 関数は、指定された待機条件が満たされているかどうかを判断する。条件が満たされていない場合、呼び出

    し側スレッドは待機状態に入る。条件が満たされるのを待機している間、そのスレッドはプロセッサ時間を消費しない。
    fWaitAll パラメータで TRUE を指定した場合、この関数は、すべてのオブジェクトがシグナル状態になるまで待機し続ける。すべてのオブジ

    ェクトがシグナル状態になるまで、この関数はオブジェクトの状態を変更しない。たとえば、あるミューテックスがシグナル状態になっても、ほ

    かのオブジェクトがシグナル状態にならない限り、この関数を呼び出したスレッドはそのミューテックスの所有権を取得することはない。この間

    に、他のスレッドがそのミューテックスの所有権を取得し、その後、そのミューテックスを非シグナル状態に設定する可能性もある。
    この関数は、特定のタイプの同期オブジェクトの状態を変更する。1 つまたは複数のオブジェクトがシグナル状態になり、それが原因でこの

    関数が制御を返した場合にのみ、それらのオブジェクトに変更を加える。たとえば、セマフォオブジェクトのカウントを 1 つ減らす。fWaitAll パ

    ラメータで FALSE を指定し、複数のオブジェクトがシグナル状態になった場合、この関数は待機条件を満たしたオブジェクトのうち、どれ

    か 1 つを選択する。選択されなかったオブジェクトの状態は何も影響を受けない。
    この関数は、lpHandles 配列内の次の各オブジェクトタイプのハンドルを指定できる。
        •変更の通知
        •コンソール入力
        •イベント
        •ジョブ
        •ミューテックス
        •プロセス
        •セマフォ
        •スレッド
        •待機可能なタイマ
    この待機関数と、ウィンドウを直接的または間接的に作成するコードを組み合わせて使う場合は、注意が必要である。1 つのスレッドがウィ

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

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

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

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

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