你如何检测到TEvent已被设置?

时间:2012-12-21 15:43:12

标签: multithreading delphi

Delphi XE2文档说明了TEvent:

  

有时,您需要等待线程完成某些操作,而不是等待特定线程完成执行。为此,请使用事件对象。应使用全局范围创建事件对象(System.SyncObjs.TEvent),以便它们可以像所有线程都可见的信号一样。

     

当线程完成其他线程所依赖的操作时,它会调用TEvent.SetEvent。 SetEvent打开信号,因此任何其他检查的线程都会知道操作已完成。要关闭信号,请使用ResetEvent方法。

     

例如,考虑一种情况,您必须等待多个线程才能完成执行而不是单个线程。因为您不知道哪个线程最后会完成,所以您不能简单地使用其中一个线程的WaitFor方法。相反,您可以让每个线程在完成后递增一个计数器,并让最后一个线程信号通过设置事件来完成它们。

但是,Delphi文档没有解释另一个线程如何检测到调用了TEvent.Set事件。你能解释一下如何检查TEvent.Set是否被调用?

1 个答案:

答案 0 :(得分:13)

如果要测试是否发出事件信号,请调用WaitFor方法并传递超时值0.如果事件已设置,则返回wrSignaled。如果没有,它会立即超时并返回wrTimeout

话虽如此,事件的正常用法不是检查它是否以这种方式发出信号,而是通过阻止当前线程进行同步,直到发出事件信号。你可以通过将非零值传递给timeout参数来执行此操作,如果您确定它将完成并且您希望等到它,则为常量INFINITE,如果您不想要,则为较小的值阻止无限期。