10

Delphi XE2 のドキュメントには、TEvent について次のように記載されています。

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

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

たとえば、1 つのスレッドではなく、複数のスレッドの実行が完了するまで待機する必要がある状況を考えてみましょう。どのスレッドが最後に終了するかわからないため、いずれかのスレッドの WaitFor メソッドを単純に使用することはできません。代わりに、終了時に各スレッドにカウンターをインクリメントさせ、イベントを設定することで最後のスレッドにすべての処理が完了したことを通知させることができます。

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

4

1 に答える 1

13

イベントが通知されたかどうかをテストする場合は、WaitForメソッドを呼び出してタイムアウト値 0 を渡します。イベントが設定されている場合は、 が返されwrSignaledます。そうでない場合は、すぐにタイムアウトして戻りwrTimeoutます。

そうは言っても、イベントの通常の使用法は、この方法で通知されたかどうかを確認することではなく、イベントが通知されるまで現在のスレッドをブロックして同期することです。これを行うには、timeout パラメーターにゼロ以外の値を渡しINFINITEます。終了することが確実で終了するまで待機する場合は定数、または無期限にブロックしたくない場合はより小さい値を指定します。時間の。

于 2012-12-21T16:00:18.640 に答える