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

Mik*_*ski 10 delphi multithreading

关于TEvent的Delphi XE2文档说明了这一点:

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

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

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

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

Mas*_*ler 13

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

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

  • @Serg:是的.但在这种特殊情况下,只需要检查它是否已设置,它也可以这种方式使用. (2认同)