8

今日、Zarko Gajic の記事を読むと混乱します。

マルチスレッド Delphi データベース クエリ

記事の URL: http://delphi.about.com/od/kbthread/a/query_threading.htm

ソースコード: http://delphi.about.com/library/weekly/code/adothreading.zip

「TCalcThread.Execute」プロシージャのコードで、次のコードを Synchronize() メソッドに配置して実行する必要がないのはなぜですか?

Line 173:    ListBox.Clear;  
Line 179:    ListBox.Items.Insert(......);
Line 188:    ListBox.Items.Add('*---------*');
Line 195:    TicksLabel.Caption := 'Ticks: ' + IntToStr(ticks);

これらのコードは VCL コンポーネントを操作しており、UI の更新に関連しています。私の知る限り、これらの操作はスレッド同期を使用し、メイン スレッドで実行する必要があります。私の知識に欠陥がありますか?

4

2 に答える 2

18

これは、Windows がスレッドの同期を行っているという事実から恩恵を受けているまれなケースです。その理由は、リストボックスの場合、コントロール固有のメッセージを持つ SendMessage を使用して項目が操作されるためです。このため、各 SendMessage 呼び出しは、コントロールが作成されたのと同じスレッド (特にメイン スレッド) によってメッセージが処理されるようにします。

何度も言いますが、これは稀なケースです。また、これら 3 つの呼び出しのそれぞれでスレッド スイッチが発生するため、パフォーマンスが低下します。Synchronize を使用して、そのコード ブロックをそれが属するメイン スレッドで強制的に実行することをお勧めします。また、SendMessage を内部的に使用しないコントロールで作業を開始しても、噛まれることはありません。

于 2010-01-19T02:15:00.363 に答える
0

それはそう。スレッドの実行中に UI の変更がないため、サンプルに問題がない可能性があります。しかし、UI は常に UI スレッド内で発生する必要があります。

同期された命令と同期されていない命令の間に見られる唯一の違いは次のとおりです。

  • 同期されていないのはパラメーターのないメソッドではないため、プログラムを書くのがより難しくなります:)
  • 同期されたメソッドは、TControl ではない TLabel を更新しているため (私の Delphi 時代を覚えていれば)、canvas を直接使用しています...

とにかく: UI は単一のスレッドによって処理されます。いつも。スレッド内で TTreeBox を更新したいと思ったら (並列処理も相互更新もありません。単に別のスレッドです)、それは非常に悪いことでした (ランダム エラー)...

于 2010-01-19T01:54:53.187 に答える