1

目前,我想出了以下代码:

先决条件:

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 资源方面)的方法?

4

3 回答 3

2

您可以使用 2 个对象等待。一是事件。另一个是设置为所需睡眠间隔的一次性等待计时器。然后使用WaitForMultipleObjects()withbWaitAll=TRUE等待两个对象都发出信号,不需要循环。

于 2021-01-07T15:52:25.660 回答
1

您的代码与事件有关。有两个选项:自动重置和手动重置事件查看 Microsoft doc。使用自动重置事件,当WaitForSingleObject由于事件发出信号而返回时,如果自动重置事件将被重置并且您将丢失事件。

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

于 2021-01-07T10:46:05.837 回答
1

您不需要为此举办活动。

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

就像是:

var signal: boolean;

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

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

于 2021-01-07T18:26:45.310 回答