2011-08-29 12 views
11

Delphi 2009でTMonitorレコードを紹介したことを大変うれしく思い、マルチスレッド環境で特定のオブジェクトをロックすることができました。私に困惑しているのは、このレコードタイプのPulseとPulseAllメソッドです。Delphiでは、System.TMonitor.PulseとTMonitor.PulseAllが実際に何をしますか

たとえばDelphiのヘルプの項目では、「呼び出し元のスレッドがオブジェクトを解放するとすぐに、指定されたオブジェクトをロックすることができる待機キュー内の次のスレッドに通知します。

本当に?どういう意味ですか?問題なしでPulseを使わずにTMonitorを使用しました。さらに、DelphiのソースでTMonitorを使用すると、Pulseを使用しないこともあります。

PulseとPulseAllのメソッドは、.NETモニタクラスとのソースレベルの互換性のためにDelphiのTMonitorレコードにのみ含まれていますか、それとも実際に目的を果たしていますか?

この問題については2つの質問("TMonitor.Pulse vs TMonitor.PulseAll""What is TMonitor in Delphi System unit good for")がありますが、私は決定的な答えを探しています。

答えて

4

参照された質問に対する私の答えの中のウィキペディアのリンクは、モニターの待機/パルス/パルス機能の使用についての議論を提供します。 スレッドは、コール待機のモニタに入る必要があります。次に、別のスレッドがモニタに入り、最初の待機スレッドを通知するためにパルスまたはパルスを呼び出す必要があります。パルスは1つの待機スレッドを通知しますが、pulseallはすべての待機スレッドを通知します。より詳細な議論については、ウィキペディアの記事の条件変数のセクションを見てください。 TMonitorのメソッドを記述したRTLソースにもコメントがあります。

+2

TMonitorはXE2で修正されていますか? –

+0

@David、私の無知を許そうとしましたが、何が間違っていたのですか? – Johan

+0

@johanどうやらWaitとPulseは正しく動作しません。 Chris Rolliston、Primoz、Eric Grangeなどから2ヶ月前にブログを投稿しています。 –