0

これはかなり簡単な質問です。私は基本的に、自分がやろうとしていることに対する「ベストプラクティス」のアプローチを探しています。

一連のブロッキング呼び出しを実行するためにワーカースレッドを起動するWin32GUIアプリケーションがあります。このスレッドで文字列メッセージをGUIに送り返して、ユーザーに表示できるようにします。

現在、WM_COPYDATAを使用して、SendMessageを使用するのが良いアプローチだと思いますか?これは正しい方向に進んでいますか?私はもともと、GUIスレッドに単純な通知メッセージを送り返すスレッドセーフキュークラスを持っていました。これにより、文字列がキューからポップされました。しかし、すぐに一歩下がって、キューは必要ないことに気づきました。文字列を直接送信することもできます。

任意のヒント?ありがとう!

編集:完全を期すために、私はC++を使用しています。

4

6 に答える 6

2

他の何人かが指摘しているように、ここではカスタム ウィンドウ メッセージが最善のアプローチかもしれません。

考慮すべきもう 1 つの点は、実際に使用されているメモリです。スレッド間で文字列を渡すことで、スレッド間で文字列の所有権も渡していると思います。これにより、次のようないくつかの問題が発生する可能性があります。

  • メモリ リーク: スレッド A がメッセージを投稿して所有権を譲渡したが、スレッド B がメッセージを処理する前にウィンドウが破棄された場合
  • 文字列をサポートするメモリ マネージャは、さまざまなスレッドでメモリを安全に割り当てて解放できますか。

最初の問題は、アプリケーションに影響を与える可能性が最も高い問題です。これは、元のアプローチを再考する良い理由だと思います。キュー自体が適切に管理されている限り、キューがメモリの一時的な所有者として機能できるため、メモリ リークを排除できます。

于 2009-06-09T05:03:32.240 に答える
2

WM_COPYDATA は正常に機能しますが、独自のプライベート ウィンドウ メッセージを定義する方がよいと思います。ワーカー スレッドに文字列を割り当て、完了したら GUI スレッドで解放します。ワーカーを不必要にブロックしないように、SendMessage の代わりに PostMessage を使用します。

于 2009-06-09T04:56:01.657 に答える
1

Visual Studio 2010は、非同期エージェントライブラリを使用して、これらの種類のシナリオを大幅に容易にします。ここでドキュメントのウォークスルーを見ることができますが、それほど疑似コードではないものがいくつかあります。

//somewhere stateful, e.g. main
unbounded_buffer<stringtype> buff;

//thread 1
{
  //send a message asynchronously to the buffer
  asend(&buff,stringtype("hello world");
}

//thread 2
{
  //get the message out of the buffer
  //if this is a UI thread, receive is blocking so use try_receive which isn't
  stringtype message = receive(&buff)
}

今日のツールセットでこれを行う場合は、スレッドセーフキューを使用します。

于 2009-06-10T05:51:36.647 に答える
1

WM_COPYDATA は、1 つのプロセスのスレッド間ではなく、プロセス間で送信するためのものです。確かにスレッド間通信に使用できますが、データを一時バッファーにコピーして受信アプリケーションに渡すために Windows がさらに作業を行う必要があるため、オーバーヘッドが大きくなる可能性があります。

あなたの懸念がアプリケーションの単純さである場合は、実装がより簡単な方法に固執してください。懸念事項がパフォーマンスである場合は、プロファイリングを行い、実際に高速なバリアントを選択してください。

于 2009-06-09T04:54:37.633 に答える
0

同様の状況で、私は常に文字列をリソース ファイルに入れ、ユーザー メッセージのパラメーターの 1 つを使用してリソース識別子を送信しました。動的な情報を送信する必要がある場合は、UI スレッドによって割り当てられたスレッドセーフ バッファーを作成し、そのバッファーへのポインターをワーカー スレッドに渡します。

于 2009-06-09T04:56:25.027 に答える
0

多くは、情報をどのように流すかによって異なります。

情報を共有する最速の方法は、競合状態を防ぐために何らかの形式のセンチネルを備えた共有変数である可能性があります。複数の文字列がある場合は、何らかのキューを持つことができます。

ただし、データ同期の経験がない場合、そのモデルを正しく理解するのは難しい場合があります。データを添付してカスタム Windows メッセージを送信すると、より単純な (バグの少ない) モデルになる可能性があります。

于 2009-06-09T09:57:20.237 に答える