您如何检测到已设置 TEvent?
Posted
技术标签:
【中文标题】您如何检测到已设置 TEvent?【英文标题】:How do you detect that a TEvent has been set? 【发布时间】:2012-12-21 15:43:11 【问题描述】:Delphi XE2 文档对 TEvent 进行了说明:
有时,您需要等待线程完成某些操作,而不是等待特定线程完成执行。为此,请使用事件对象。事件对象 (System.SyncObjs.TEvent) 应该在全局范围内创建,以便它们可以像信号一样对所有线程可见。
当一个线程完成其他线程所依赖的操作时,它会调用 TEvent.SetEvent。 SetEvent 打开信号,因此任何其他检查的线程都将知道操作已完成。要关闭信号,请使用 ResetEvent 方法。
例如,考虑一种情况,您必须等待多个线程而不是单个线程完成它们的执行。因为您不知道哪个线程将最后完成,所以您不能简单地使用其中一个线程的 WaitFor 方法。相反,您可以让每个线程在完成时增加一个计数器,并让最后一个线程通过设置事件来表示它们都已完成。
然而,Delphi 文档并没有解释另一个线程如何检测到调用了 TEvent.Set 事件。您能否解释一下如何检查是否调用了 TEvent.Set?
【问题讨论】:
你为什么不等待所有的线程/事件都发出信号呢?为什么要测试而不是等待? 感谢您的评论。事实上,为了响应我在这里收到的帮助,我已经编写了代码以等待事件发出信号。 【参考方案1】:如果要测试是否有事件发出信号,请调用WaitFor
方法并传递超时值0。如果设置了事件,它将返回wrSignaled
。如果没有,它会立即超时并返回wrTimeout
。
话虽如此,一个事件的正常使用不是检查它是否以这种方式发出信号,而是通过阻塞当前线程直到事件发出信号来进行同步。您可以通过将一个非零值传递给 timeout 参数来执行此操作,如果您确定它会完成并且您想等到它完成,则可以是常量 INFINITE
,或者如果您不想阻止,则可以使用较小的值。无限期。
【讨论】:
通常WaitFor
与无限或小但非零超时一起使用。
@Serg:是的。但是在这个特定的情况下,只是想检查它是否设置,它也可以这样使用。以上是关于您如何检测到已设置 TEvent?的主要内容,如果未能解决你的问题,请参考以下文章
如何将具有外键的 NOT NULLABLE 列添加到已包含数据的现有表中?
如何将 Laravel 身份验证添加到已启动的 Laravel 项目中?