QWorker技巧之随机间隔作业

正常的重复作业之间的时间间隔一旦确定下来,但不会再变化,理论上它只受系统资源的限制(如没有足够的处理器资源,造成作业无法被处理)。

但如果在特殊环境下,我们要完成一个不规则的定时器,则可以使用Delay函数来规则一个延迟作业,然后在延迟的作业中,再次Delay自身,这样子循环往复,形成一个不规则的定时器。只要每次Delay的时间随机,那么整个作业之间的时间间隔也就变得随机了。示例如下:

步骤一:用Delay函数投寄一个延迟执行的作业。

...
Workers.Delay(DoRandDelay, Q1Second, nil);
...

步骤二:在作业处理函数中处理作业,在作业完成时,再重新调用Delay投递新的作业。

procedure TForm1.DoRandDelay(AJob: PQJob);
var
  ANewDelay:Integer;
begin
...//作业处理代码
ANewDelay:=Q1Second+random(Q1Second)-(GetTimeStamp-AJob.PopTime);
if ANewDelay<0 then//要延迟的时间到了,直接设置为0,相当于Post
   ANewDelay:=0;
Workers.Delay(AJob.WorkerProc.Proc, ANewDelay,AJob.Data, True);
end;

要更精确的控制时间,可以通过访问参数的PopTime知道作业的开始计划执行的时间,然后进行相应的数学运算就可以了,这里就不再缀述。

分享到: