1

メイン アプリケーションからスレッドにデータを渡すにはどうすればよいですか?

メイン アプリケーション内に、エラー メッセージを処理するためのスレッドを作成しました。エラーが発生した場合、メイン アプリケーションでデータを処理しているときに、エラー メッセージが生成され、それが構造体に書き込まれます。このエラー メッセージ (構造) は、スレッドに渡されてさらに処理される必要があり、メイン アプリケーションは作業を続行する必要があります。WindowsプラットフォームのCでこれをやろうとしています。

アプリケーションで実行されるスレッドは 1 つだけです。現時点では、グローバル変数構造 (myData) を定義しており、 PostThreadMessage を使用してそれを渡しています。

struct myData errorData;

メインアプリケーションからメッセージを投稿する

PostThreadMessage(ErrorLogId, THRD_MESSAGE_EXIT , 0 , (LPARAM)&errorData);

私が持っているスレッドで

MsgReturn = GetMessage(&msg, NULL, THRD_MESSAGE_SOMEWORK, THRD_MESSAGE_EXIT);

現時点では問題なく動作しています。ただし、エラー メッセージの処理に時間がかかる場合は、それまでにメイン アプリケーションで新しいエラーが発生し、グローバル構造体 errorData のデータが更新される可能性があります。

ロック機構を使用できますが、スレッドの処理が完了するまでメイン アプリケーションを停止できません。グローバル変数として持たずにデータを渡すにはどうすればよいですか?

4

4 に答える 4

2

struct myDataを呼び出すたびに の新しいインスタンスを作成したい場合がありますPostThreadMessage()

スレッドは、処理が完了するとfree()、このインスタンスが必要にstruct myDataなります。

現在のアプローチに同期を追加することは、メイン タスクの継続中にワーカーを生成するという非同期の概念に反します。

とにかく、たとえば共有ログファイルに何かを書き込む場合、スレッドは依然として同期を使用する必要があります。

于 2012-10-24T08:34:33.020 に答える
1

struct myData解決策は、 (を使用してmalloc()) を毎回動的に割り当て、データを入力し、処理のためにスレッドに渡すことです。free()スレッドは、処理が完了するとそれを処理する責任があります。

このアプローチにより、グローバル オブジェクトのスレッド間の同期が削除されますerrorData(不要になったため)。

于 2012-10-24T08:34:03.047 に答える
1

エラーメッセージを動的に ( で) 割り当て、malloc()それを埋め、それへのポインターをメッセージ内のスレッドに渡すのはどうですか? 次に、スレッドはメッセージを処理し、( を使用してfree()) 割り当てを解除します。

于 2012-10-24T08:34:38.010 に答える
0

編集:

メッセージ キューが既に存在することに気づきませんでした。申し訳ありませんが、もちろん、動的に割り当てられたメッセージで十分です。

参考のための古い答え:

スレッドがエラー メッセージの処理を完了するまで待ちたくない場合は、メイン スレッドとワーカー スレッド間の通信に同期キューを使用する必要があります。これは、私が何を意味するかを説明するための擬似コードです。

ワーカー スレッド:

while (queue_is_empty())
  wait;
lock(queue);
process_error(read(queue));
unlock(queue);

メインスレッド:

if (error)
  lock(queue)
  write(queue, error)
  unlock(queue)
  //possibly signal thread

ゼロから実装する必要はありません。RabbitMQのようなものを使用できます。

于 2012-10-24T08:34:19.877 に答える