<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 がスレッドのキューに置かれたか、またはタイムアウト時間が経過すると制御を返す。 |
|||||||||||||
パラメータ
MAXIMUM_WAIT_OBJECTS である。
もできる。しかし、同じハンドルの複数のコピーを格納することはできない。 FALSE を指定すると、lpHandles 配列内のオブジェクトのどれか 1 つがシグナル状態になったときに制御が返る。この場合、戻り値は、
関数が制御を返す状況をもたらした(つまり、シグナル状態になった)オブジェクトを表す。 も、また、I/O 完了ルーチンや APC がキューに置かれていなくても、制御が返る。0 を指定すると、この関数はオブジェクトの状態を調べ、 I/O 完了ルーチンや APC がキューに置かれているかどうかをチェックし、即座に制御を返す。INFINITE を指定すると、条件が満たされる
まで待機し続ける。 返り、その I/O 完了ルーチンや APC 関数が実行される。FALSE を指定すると、制御は返らず、その I/O 完了ルーチンや APC 関数も実
行されない。 び出し側スレッドと読み書き操作を開始したスレッドが同じ場合にのみ、その完了ルーチンが呼び出される。QueueUserAPC 関数を呼び出
すと、APC がキューに置かれる。
関数が失敗すると、-1 が返る。拡張エラー情報を取得するには、 関数を使う。
解説
し側スレッドは待機状態に入る。条件が満たされるのを待機している間、そのスレッドはプロセッサ時間を消費しない。 ェクトがシグナル状態になるまで、この関数はオブジェクトの状態を変更しない。たとえば、あるミューテックスがシグナル状態になっても、ほ かのオブジェクトがシグナル状態にならない限り、この関数を呼び出したスレッドはそのミューテックスの所有権を取得することはない。この間
に、他のスレッドがそのミューテックスの所有権を取得し、その後、そのミューテックスを非シグナル状態に設定する可能性もある。 関数が制御を返した場合にのみ、それらのオブジェクトに変更を加える。たとえば、セマフォオブジェクトのカウントを 1 つ減らす。fWaitAll パ ラメータで FALSE を指定し、複数のオブジェクトがシグナル状態になった場合、この関数は待機条件を満たしたオブジェクトのうち、どれ
か 1
つを選択する。選択されなかったオブジェクトの状態は何も影響を受けない。 ンドウを作成した場合、そのスレッドはそのウィンドウに関係するメッセージを処理しなければならない。また、メッセージのブロードキャスト(同 報送信)が発生した場合、システム内のすべてのウィンドウへそのメッセージが送信される。タイムアウト時間として INFINITE を指定して待 機関数を呼び出していた場合、このような現象が発生すると、システムはデッドロック状態に陥ることがある。ウィンドウを間接的に作成す る 2 つの例として、DDE と COM の CoInitialize がある。そのため、ウィンドウを作成するスレッドでは、WaitForMultipleObjectsEx 関数 ではなく、MsgWaitForMultipleObjects または MsgWaitForMultipleObjectsEx 関数を使う。 |