10

Delphi XE2 文档对 TEvent 进行了说明:

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

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

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

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

4

1 回答 1

13

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

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

于 2012-12-21T16:00:18.640 回答