2011-01-19 22 views

答えて

1

Application.ProcessMessagesを使用することは決してありません。ワームの可能性があります。
本当に。
私は繰り返します:Application.ProcessMessagesを使用しないでください。
This is why:すべてのメッセージが常に再入可能である必要があります。
あなたのメッセージング、さらに重要なことに、あなたが使っているライブラリのメッセージング(再入可能であることがわからない種類のメッセージ)。
今後、今後予定されています。
まだテストしていない場合や、まだ見ていない使用パターンであっても。

マルチスレッドが必要です。
あなたは本当にすべきです。
同期を正しく行うには時間がかかるかもしれませんが、backgroundworkerのような形式を使用すると、大部分をきちんとまとめることができます。

マルチスレッドができない場合は、cheatを入力してください。
しかし、あなたは不正行為をしてはいけません。

あなたの本当の解決策を延期しようとしています。
これ以上延期するのは延期です。

upstream decisions and downstream costsです。
後で悪い決断をするのは、今すぐ正しい決断をしてから、それを正しくするために少し時間を費やすよりも高価です。

編集:モーダルフォームまたはダイアログを表示するとき

二次メッセージループを使用するための唯一の例外です。 2次メッセージループには、モダリティのためにこれらのメッセージが限定されて届いています。

編集2:

他のすべての形態のモダリティの結果を自動的に無効にします。タイマーやその他の非UIメッセージはまだ処理されているため、再入可能性は引き続き発生します。

--jeroen

+3

これは 'Application.ProcessMessages'に対するこの呼び名は少し面倒です。 2次メッセージループを実行すると、コードがリエントラントでない場合にのみ問題が発生しますが、それはそれ自体にとって貴重な特性です。コードをワーカースレッドに移動するだけで、 'Application.ProcessMessages'と同じ問題が発生する可能性があります。*安全でないコードパスを再入力することは不可能です。ワーカースレッドがまだ実行されているためボタンを無効にする必要があり、呼び出されたコードに 'Application.ProcessMessages'が含まれているため、ボタンを使用する必要があります。 – mghie

+4

@Jeroen私は 'Application.ProcessMessages'を問題なく呼び出すプログラムをやっています。しかし、はい、糸がより良いです。 –

+0

@mghie:あなたの仕事をスレッドに入れてやるのは、そのスレッドとやりとりするものだけがスレッドセーフである必要があるということです。あなたはそれに影響を与えます。 'Application.ProcessMessages'では全てのメッセージ処理がスレッドセーフである必要があります。特に影響を与えないビットです。 –

4

別スレッドで実行してください。あなたは(かかる時間タスク(またはループ)に応じて)2つの選択肢があり、私の観点から

0

を(のTThreadクラスを参照してください):アレクサンダー・マラコフが述べたように

  • がスレッドを使用します。
  • add Application.ProcessMessages(UIを描画してイベントに応答するようアプリケーションに強制しますが、アプリケーションが必要な場合はループが完了するたびにループに時間がかかります応答するには、しかし、私はそれを長時間のループがスレッドを使用するため、時間ループのほんの少しのために推奨します。
+5

いいえ、NO、NO、NO! Application.Processメッセージは使用しないでください。あまりにも多くの副作用(https://forums.embarcadero.com/message.jspa?messageID=56704#56704)があり、常にすべてのメッセージ処理が再入可能であることが必要です。メッセージ処理だけでなく、すべてのメッセージ処理は、あなたのアプリのどこにでも、今、そして将来的に。しないでください! –

+1

+1イエローですが、初心者の方はこれがスレッドの本当の価値を理解するのに役立ちます。もし初心者でなければ、彼はすでに自分が正しいと知っています。目的を達成するためには、そのトリックを行うかもしれません。 – ComputerSaysNo

+0

だからこそ、私は私の答えに背景職人を示唆した。それはマルチスレッドの生活をはるかに簡単にします。 –

関連する問題