1

STA スレッド同期を行うには何が最適でしたか?

メインと 2 番目の 2 つの STA スレッドを持つダイアログ ベースの MFC アプリケーションがあります。メイン UI スレッドで COM オブジェクトを作成しました。

2 番目のスレッドから COM インターフェイスを呼び出します。メイン スレッドでは、メイン スレッドが続行する前に 2 番目のスレッドが確実に終了するように、ループを使用してスレッドを待機します。このループは、MsgWaitForMultipleObjectsEx(timout=500) をループ的に呼び出します。

待っているとすぐに行き詰まりました。その後、MFC メッセージ ポンプである AfxInternalPumpMessage() は、呼び出しのブロックにのみ役立ち、デッドロック状態にはまったく役立たないことに気付きました。

次に、待機ループに Peek/Translate/DispatchMessage コードを追加すると、すべてが機能しました。

さて、Peek/Translate/DispatchMessage ループを手作業でコーディングしないと、STA スレッドの同期をまったく行うことができないようですか? 待機呼び出しがあると、デッドロックが発生します。では、STA スレッドを同期するための最善または標準的な方法は何ですか?

ありがとう!

4

2 に答える 2

2

おそらくあなたは探していCoWaitForMultipleHandlesますか?

呼び出し元がシングル スレッド アパートメントに存在する場合、CoWaitForMultipleHandles は COM モーダル ループに入り、スレッドのメッセージ ループはスレッドのメッセージ フィルターを使用してメッセージをディスパッチし続けます。スレッドにメッセージ フィルタが登録されていない場合は、既定の COM メッセージ処理が使用されます。

于 2011-06-27T06:46:54.763 に答える
0

待機はありませんが、メッセージループの実行を停止する待機は、実際にデッドロックになります。解決策は、待機ループとメッセージループの処理をインターリーブすることです。少し待ってから、保留中のすべてのメッセージを処理し、繰り返します。

于 2011-06-27T06:29:17.030 に答える