2007-12-02

WaitForMultipleObjectsの待機オプション

マルチスレッドで複数のオブジェクトの同期をとる場合はWaitForMultipleObjectsを利用します。
 
WM6 SDKでの定義はこんな感じ。
WINBASEAPI
DWORD
WINAPI
WaitForMultipleObjects(
    DWORD cObjects,
    __in_ecount(cObjects) CONST HANDLE *lphObjects,
    BOOL fWaitAll,
    DWORD dwTimeout
    );
 
最初の引数で 2番目の引数の同期オブジェクト配列の大きさを指定し、4番目の引数でタイムアウトの時間を指定します。
3番目の引数はフラグで TRUEの場合は指定された全てのオブジェクトがシグナル状態になるまで待ち、 FALSEの場合はどれか1つのオブジェクトがシグナル状態になるのを待つ...と思っていました。
MSDNにもそう書かれています。
 
ところが、RfLedRestrictorの修正中にどうしても複数スレッドの終了を待ちたくて WaitForMultipleObjectsを使おうとしたのですが どうもうまく動きません。
実はこれまでも WifiInfoや Use10Keyやらで使おうとしてもうまく動かなかった経験があります。
 
仕方なく適当にドキュメントを読みながら、 ふとWaitForMultipleObjectsのページに移った時に 信じられない記述を見つけました。
fWaitAll
[in] Specifies the wait type. This parameter must be set to FALSE. This causes function to return when the state of any one of the objects set to is signaled. The return value indicates the object whose state caused the function to return.
(実際は黒字のままです)
 
他と変えるなら強調表示くらいしとかんかい(笑
 
どうやら Windows Mobileでは fWaitAllには FALSEしか指定できないみたいです。
「ちゃんとドキュメント読め」と言われればそれまでなのですが、もう少し違いを分かりやすく書いて欲しいですよね。
 

0 件のコメント: