问题描述
目前,我想出了以下代码:
先决条件:
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
...