子スレッドがウィンドウ作成完了するまで待ってみよう。
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