c++ - メッセージループが別のスレッドにあるときにウィンドウが閉じるまで待機する

c++ windows multithreading

あるC++アプリケーションでは、メインスレッドがシミュレーションの計算とレンダリングに忙しいため、メッセージループが別のスレッドで実行されるウィンドウがあります。このウィンドウは、シミュレーションのログウィンドウとして機能します。シミュレーションが例外をスローすると、シミュレーションが閉じ、ログウィンドウに詳細が表示されます。

これで、メインスレッドはログウィンドウが閉じるまで待機する必要があります。メッセージループは別のスレッドで実行されるため、私は

WaitForSingleObject(logwindow->thread, INFINITE);


メインスレッドから。

ただし、これによりメッセージポンプがブロックされ、ログウィンドウがフリーズします。では、ウィンドウが閉じられるか、スレッドが終了するまで、正しく待機するにはどうすればよいですか?

ED:ウィンドウはメインスレッドで作成されますが、別のスレッドで実行されます。メッセージループスレッドでも作成されるように変更します。
答え
いくつかのオプションがあります。


メインスレッドからすべてのUIを実行し、レポートを同期して、たとえばPostMessageまたはSendMessageを介してメインスレッドに表示を戻すようにワーカースレッドを取得します。
待たずに、ワーカースレッドがメインスレッドにメッセージを投稿するようにします。
待機にはMsgWaitForMultipleObjectsを使用します。


MsgWaitForMultipleObjectsについて詳しく説明すると、これは、メッセージがキューに到着したときに戻るように構成できる待機関数です。したがって、キューに入れられたメッセージの処理の間にブロッキング待機を使用しながら、メッセージポンプを存続させることができます。

疑似コードでは、次のように記述します。

do
{    
    WaitResult = MsgWaitForMultipleObjects(1, hThread, TRUE, INFINITE, QS_ALLEVENTS);
    if (WaitResult == MessageArrivedOnQueue) 
        PumpMessageQueue();
} while (WaitResult != WaitHandlesSignaled)
関連記事

c++ - ヘッダーファイルを正しく含めることができません

c++ - alListener3f(AL_ORIENTATION、0、0、-1)の後のOpenAL AL_ILLEGAL_ENUM

c++ - C++で書かれた人気のあるオープンソースプロジェクトはありますか? [閉まっている]

c++ - グローバルオブジェクトをCOMクラスファクトリとして使用することは合法ですか?

c++ - 私のwifiがセキュリティで保護されているかどうかを確認するプログラム(つまり、WPA2 / WEP)をWindows C++で

c++ - LinuxでC++を使用してInformixデータベースを照会するにはどうすればよいですか? C++のオブジェクトインターフェイスを使用するとコンパイラエラーが発生する

c++ - バイナリの問題==

c++ - セットアップユーティリティアイコンの使用

c++ - valarrayと配列の間のコピーを回避する方法はありますか?

c++ - ポインタとオーバーロードに関する質問(.append()は1行では機能しません)