子スレッドがウィンドウ作成完了するまで待ってみよう。

WaitForSingleObject を使って、親スレッドは作成完了を待ってるわけですが、どーも子供が CreateWindow した時に戻ってくるのが遅い。

「親が WaitForSingleObject で待機しちゃってるのでメッセージ処理できず -> 子供ウィンドウはメッセージ送信が Timeout するまで帰ってこない」

という感じなのかと思い、次のような関数を作ってみた所どうやらアタリのようで、スグに制御が帰ってくるようになりました。 (この関数は親スレッドが利用し、引数のハンドルにはイベントハンドルが指定されます。)


BOOL CKanaria::WaitThreadEvent(HANDLE hHandle)
{
    int     nLoopCount  = 0;
    DWORD   dwResult    = ::WaitForSingleObject(hHandle, 0);
    while(dwResult != WAIT_OBJECT_0)
    {
        // 待ってるときも一応メッセージ処理しようぜ。
        MSG msg;
        if(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
        }

        if(++nLoopCount > s_nLoopOverTimes)
            return false;

        if(dwResult != WAIT_TIMEOUT)
            return false;

        dwResult = ::WaitForSingleObject(hHandle, 1);
    }

    return true;
}

ちょっとカッコ悪いけど、まぁ仕方ない〜。



なんて思ってたら、

メッセージキューまで対象としてくれるMsgWaitForMultipleObjects なんて関数を発見してしまって、えらいゲンナリ。 orz