2012-12-21 5 views
9

デルファイXE2のドキュメントがにTEventについては、これを言う:TEventが設定されていることをどのように検出しますか?

時には、あなたではなく、実行を完了するために特定のスレッドを待っているよりも、いくつかの操作を完了するためのスレッドを待つ必要があります。これを行うには、イベントオブジェクトを使用します。イベントオブジェクト(System.SyncObjs.TEvent)は、グローバルスコープで作成して、すべてのスレッドから見える信号のように動作できるようにする必要があります。

スレッドが他のスレッドが依存する操作が完了すると、スレッドはTEvent.SetEventを呼び出します。 SetEventはシグナルをオンにするので、チェックされた他のスレッドは操作が完了したことを知ります。信号をオフにするには、ResetEventメソッドを使用します。

たとえば、1つのスレッドではなく複数のスレッドが実行を完了するのを待たなければならない状況を考えてみましょう。どのスレッドが最後に終了するかわからないので、スレッドのいずれかのWaitForメソッドを使用するだけではいけません。代わりに、各スレッドが終了したときにカウンタをインクリメントさせ、イベントを設定することによってすべてのスレッドが最後に信号を受け取るようにすることができます。

ただし、Delphiのドキュメントでは、別のスレッドがTEvent.Setイベントが呼び出されたことを検出する方法については説明しません。 TEvent.Setが呼び出されたかどうかをチェックする方法を説明してください。

+2

すべてのスレッド/イベントが通知されるのを待ってみませんか?なぜ待つのではなくテストするのですか? –

+0

ご意見ありがとうございます。私がここで受け取った助けに応えて、実際にはイベントが通知されるのを待つようにコードをプログラムしました。 –

答えて

11

イベントが通知されているかどうかをテストする場合は、WaitForメソッドを呼び出し、タイムアウト値0を渡します。イベントが設定されている場合は、wrSignaledが返されます。そうでない場合は、すぐにタイムアウトしてwrTimeoutを返します。言い換えれば、イベントの通常の使用は、それがこのように通知されているかどうかをチェックするのではなく、イベントが通知されるまで現在のスレッドをブロックすることによって同期することです。ゼロ以外の値をtimeoutパラメータに渡します。一定の場合は、終了することを確信している場合は定数INFINITE、そうでない場合は待機したい場合は不定の値をブロックしたくない場合は小さな値を渡します時間の長さ。

+0

通常、WaitForは無限または小さいがゼロ以外のタイムアウトで使用されます。 – kludg

+2

@Serg:True。しかし、この特定のケースでは、単に設定されているかどうかを確認したいだけでなく、この方法でも使用できます。 –

関連する問題