等待一个事件,但至少在指定的时间内

问题描述

目前,我想出了以下代码

先决条件:

CONST MinTime = 1000; // ms //
VAR ObjHandle : THandle := CreateEvent(NIL,TRUE,FALSE,'Event');
VAR T : LongWord;
VAR Signalled : BOOLEAN;

代码

T:=GetTickCount; Signalled:=FALSE;
REPEAT
  CASE WaitForSingleObject(ObjHandle,MinTime) OF
    WAIT_OBJECT_0 : Signalled:=TRUE
  END
UNTIL Signalled AND (GetTickCount-T>=MinTime);

这段代码的目的是等待一个外部信号事件(来自另一个线程),但最多每秒只响应一次。这是实现此目的的正确方法,还是有更优化(cpu 资源方面)的方法

解决方法

可以使用2个对象上等待。一个是事件。另一种是单触发waitable timer设置为所需的休眠时间间隔。然后使用WaitForMultipleObjects()bWaitAll=TRUE以等待两个对象用信号,无环需要的。

,

您的代码在事件中存在问题。有两个选项:自动重置和手动重置事件Look at Microsoft doc。使用自动重置事件,当 WaitForSingleObject 因事件发出信号而返回时,如果自动重置事件将被重置并且您将失去该事件。

您可以使用手动重置事件并自行管理(更复杂),或者一旦您从之前的处理中获取事件并且时间太短,请使用简单的 Sleep 来等待丢失的时间。

,

您不需要为此举办活动。

只需使用一个变量,如果它应该是线程安全的,则带有一个临界区。

类似于:

var signal: boolean;

  signal := false;
  sleep(minTime);
  if signal then
  begin
    // do something
    signal := false;
  end;

用任何条件替换 signal 布尔值,例如 if somelist.count>0 then...