您如何检测到已设置 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?的主要内容,如果未能解决你的问题,请参考以下文章

RStudio 未检测到已安装的 R

如何将具有外键的 NOT NULLABLE 列添加到已包含数据的现有表中?

如何将文件添加到已创建的桥接头中?

如何将 Laravel 身份验证添加到已启动的 Laravel 项目中?

SQL Server - 如何将 RANK 函数插入到已按排名顺序排序的行中?

iOS 13 如何清理缓存?