5

私の質問は次のとおりです。SendMessage() を使用して、2 つのスレッド間のスレッド通信を実装するにはどうすればよいですか。1 つはウィンドウ (GUI) で、もう 1 つはウィンドウなしです。

問題は、SendMessage() がハンドル (HWND) を必要とすることですか?

私のプロジェクトに関するもう 1 つの詳細: 2 つのスレッド、1 つはマネージド コードを実行 (ユーザー インターフェイスのあるスレッド)、もう 1 つはネイティブ コードを実行 (ウィンドウのないスレッド)

どうもありがとうございました!

4

4 に答える 4

4

非表示のウィンドウを作成することをお勧めします。postthreadmessageを使用する場合、メッセージが失われる可能性があります(つまり、メッセージボックスがメッセージループを実行している場合)。

詳細については、以下をご覧ください。

http://blogs.msdn.com/oldnewthing/archive/2005/04/26/412116.aspx

于 2009-01-16T21:48:15.867 に答える
3

おそらく、PostMessageまたはPostThreadMessageを使用してみてください。

于 2009-01-16T19:43:04.263 に答える
2

スレッドにウィンドウ、メッセージ キュー、およびメッセージ ディスパッチャーがない場合、スレッドへのメッセージの送信は困難になります。スレッドが通信目的のためだけに非表示のウィンドウを作成することは一般的です (Windows Spy を調べてみると、多くの例が表示されます)。

1 つの代替方法は、共有メモリと、イベントやセマフォなどの同期プリミティブを使用することです。もう 1 つの方法は、パイプを使用することです。

于 2009-01-16T20:24:12.667 に答える
2

@jdigitalが言ったこと。非表示のウィンドウを作成し、スレッドがまだメッセージ ループを実装していない場合 (通常の win32 での会話、または COM STA のコンテキストでのいずれか) に注意してください。メッセージ ループも作成する必要があります。_AtlModule.RunMessageLoop();残念ながら、これは問題のスレッドがメッセージ ループ内にある間は、おそらくイベント ドリブンである必要があることも意味します。MsgWaitForMultipleObjects のようなトリッキーなこともできますが、面倒です。

ATL/COM に慣れている場合は、非表示のウィンドウの例を次に示します。私はしばらく前にこの痛みを経験し、microsoft.public.vc.atl に関する有用な議論があると考えましたが、今見つけられる最良のものはこの投稿です。これは、メッセージ ループの変形について詳細に説明します (キーストローク アクセラレータまたはモードレス ウィンドウを使用している場合、どうすればよいか、アプリケーションにはないように思えます)。

于 2009-01-16T21:30:07.417 に答える