1

UI スレッドと作業スレッドの間で通信する必要がある場合、スレッド セーフ (ハンドルの再構築) のために非表示のウィンドウを作成する必要があることが知られています。

例として:

  • Form1TProgressBarバックグラウンドで実行中の同じ名前のN 個の動的に作成されたインスタンスがあります。
  • WM_REFRESHタスク スレッド内でのみ呼び出されることが常に保証されます。
  • Form1H : THandle property次のプロシージャを割り当てます。

    手順 RefreshStat(var Message: TMessage); メッセージ WM_REFRESH;

  • の内部RefreshStatでは、バックグラウンド スレッドが 1 つしかない場合、パラメータを使用LWてタスク ID と位置を簡単にマッピングできます。

タイトルが知りたいことを表しているかどうかはわかりませんが、複数のバックグラウンド タスクが実行されているアプリケーションがあるとします。
私の場合、私はTProgressBar進行状況を報告するために使用します。

AllocateHwndすべてのメッセージが競合状態なしで非表示のウィンドウに到着することを保証しますか?
2 つ以上のタスクが同時にメッセージを投稿するとどうなりますか?

これを手動で制御する必要がある場合は、カスタム メッセージで別のメッセージ ループ システムを作成する以外に、他に何かすることがあるでしょうか。

質問が十分に明確であることを願っています。

4

1 に答える 1

5

スレッドに関連付けられたメッセージ キューは、スレッドセーフ キューです。他の複数のスレッドからの同期メッセージと非同期メッセージの両方が、有害な日付競合なしで安全に配信されます。SendMessage や PostMessage などの Windows メッセージ API 関数を呼び出す場合、外部同期は必要ありません。

2 つのスレッドが同時に同じウィンドウにメッセージをポストまたは送信した場合、どちらのメッセージが最初に処理されるかは保証されません。これは良性の競合状態と呼ばれるものです。1 つのメッセージを他のメッセージより前に処理する場合は、順序付けを行う必要があります。

于 2013-07-22T21:12:35.630 に答える