一般的延迟重复作业的直接调用 Delay 时,指定间隔时间和重复参数,就可以自动启动了重复的延迟作业。但默认情况上,这个延迟作业的间隔时长是固定的,要动态修改这个时长,我们可以如下操作:
1、修改作业对象实例的 Source.FirstDelay 参数的值。如下所示:
Workers.Delay(
procedure (AJob:PQJob)
begin
...
AJob.Source.FirstDelay:=新的延迟时间;
...
end,Q1Second,nil,false,jdfFreeByUser,true);
注意 FirstDelay 的时间精度是 0.1ms,建议使用 Q1Second*5 这样的方式来指定时长。
2、使用 Delay+Delay 的方法来修改时长,这种方式实际上通过投递新的延迟作业来实现不定长延迟的目标。如下所示:
Workers.Delay(
procedure (AJob:PQJob)
begin
Workers.Delay(TQJobProcA(AJob.WorkerProc.ProcA),Q1Second*(1+random(10)),AJob.Data,AJob.InMainThread,AJob.FreeType,false);
DebugOut('%s fired',[FormatDateTime('yyyy-mm-dd hh:nn:ss',Now)]);
end,Q1Second,nil);
因为是匿名作业,没有函数名,但你可以通过 AJob.WorkerProc.ProcA 获取到它的作业匿名函数的实例地址,做为参数传递进去,从而实现重复投递作业的目的。