WSAWaitForMultipleEvents

指定したイベントオブジェクトのいずれか、またはすべてがシグナル状態になる、タイムアウトが経過する、または I/O 完了ルーチンが実行されたときに戻る。

WSAWaitForMultipleEvents cEvents, lphEvents, fWaitAll, dwTimeout, fAlertable

cEvents : [int] lphEvents が指す配列内のイベントオブジェクトハンドル数。最大値は WSA_MAXIMUM_WAIT_EVENTS。1 つ以上のイベントを指定しなければならない。
lphEvents : [intptr] イベントオブジェクトハンドル配列へのポインタ。配列には異なる型のオブジェクトハンドルを含められる。fWaitAll が TRUE のときは同じハンドルを複数含めてはならない。待機中にいずれかのハンドルが閉じられた場合の動作は未定義である。ハンドルは SYNCHRONIZE アクセス権を持たなければならない。詳しくは Standard Access Rights を参照。
fWaitAll : [int] 待機種別を指定する値。TRUE の場合、lphEvents 配列内のすべてのオブジェクトがシグナル状態になったとき関数が戻る。FALSE の場合、いずれかのイベントがシグナル状態になったときに関数が戻る。後者の場合、戻り値から WSA_WAIT_EVENT_0 を引いた値がどのイベントでシグナルが立ったかを示すインデックスとなる。呼び出し中に複数のイベントがシグナル状態になった場合、最小インデックスのものを示す。
dwTimeout : [int] タイムアウト時間 (ミリ秒単位)。fWaitAll で指定した条件が満たされなくてもタイムアウトが経過すれば WSAWaitForMultipleEvents は戻る。dwTimeout が 0 ならば、WSAWaitForMultipleEvents は指定イベントの状態を調べて即座に戻る。WSA_INFINITE ならば無限に待機する。
fAlertable : [int] スレッドを I/O 完了ルーチンが実行可能なアラート可能待機状態に置くかを指定する値。TRUE の場合、スレッドはアラート可能待機状態に置かれ、システムが I/O 完了ルーチンを実行したときに WSAWaitForMultipleEvents が戻ることがある。このとき WSA_WAIT_IO_COMPLETION が返り、待機中のイベントはまだシグナル状態ではない。アプリケーションは WSAWaitForMultipleEvents を再度呼び出さなければならない。FALSE の場合、アラート可能待機状態には置かれず I/O 完了ルーチンは実行されない。

(プラグイン / モジュール : ws2_32.dll)

解説

指定したイベントオブジェクトのいずれか、またはすべてがシグナル状態になる、タイムアウトが経過する、または I/O
完了ルーチンが実行されたときに戻る。

[戻り値]
WSAWaitForMultipleEvents 関数が成功した場合、戻り値は次のいずれかとなる。
このドキュメントは省略されている。

[備考]
WSAWaitForMultipleEvents
関数は、待機条件が満たされているかを判定する。満たされていない場合、呼び出しスレッドは待機状態に入る。待機中は CPU
時間を消費しない。指定オブジェクトのいずれか、またはすべてがシグナル状態になったとき、あるいはタイムアウトが経過したときに
WSAWaitForMultipleEvents は戻る。bWaitAll が TRUE
のとき、待機はすべてのオブジェクトがシグナル状態になった時点でのみ完了する。bWaitAll が FALSE
のとき、WSAWaitForMultipleEvents は lphEvents
を先頭から順にチェックし、最初にシグナル状態になったオブジェクトのインデックスを返す。fAlertable を TRUE
にすれば、アラート可能待機が可能となり、呼び出しスレッドで I/O 完了ルーチンが実行されたときに関数が戻る。スレッドは I/O
完了ルーチン (APC) を実行させるためにアラート可能待機状態にある必要がある。したがって、I/O
完了ルーチンを持つ保留中の非同期操作があっても fAlertable が FALSE なら、それら I/O
完了ルーチンは完了時であっても実行されない。fAlertable が TRUE で保留中の操作のいずれかが完了すると、APC が実行され
WSAWaitForMultipleEvents は WSA_IO_COMPLETION
を返す。このとき待機イベントはまだシグナル状態ではなく、アプリケーションは再度 WSAWaitForMultipleEvents
を呼び出さなければならない。イベントを待たずにアラート可能待機だけ行いたい場合は Windows の SleepEx
を使うべきである。現在の実装では WSAWaitForMultipleEventsWaitForMultipleObjectsEx
を呼び出している。注: ウィンドウを直接/間接に作成するコードと共に WSAWaitForMultipleEvents
を使う場合は注意が必要である。スレッドがウィンドウを作成すればメッセージ処理が必要となる。メッセージブロードキャストはシステム内のすべてのウィンドウに送られる。dwTimeout
に WSA_INFINITE を指定したスレッドがウィンドウを持つとデッドロックの原因になりうる。サンプルコード: 次は
WSAWaitForMultipleEvents の使い方の例である。
このドキュメントは省略されている。

情報

プラグイン / モジュールws2_32.dll
バージョン1.0
作成日2026/04/16
著作者IronHSP / CsWin32 bridge
URLhttps://github.com/inovia/IronHSP
備考Win32 API の ws2_32.dll 関数群。CsWin32 + win32metadata から自動生成。
hsp3net 専用 (intptr / NSTRUCT / wstr を使用)。
タイプ拡張命令
グループWin32API
対応環境
  • Windows 版 HSP
hs ファイルhsphelp\win32_ws2_32_gen2.hs