正常的重复作业之间的时间间隔一旦确定下来,但不会再变化,理论上它只受系统资源的限制(如没有足够的处理器资源,造成作业无法被处理)。
但如果在特殊环境下,我们要完成一个不规则的定时器,则可以使用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知道作业的开始计划执行的时间,然后进行相应的数学运算就可以了,这里就不再缀述。