[教程]QWorker 中如何动态修改重复延迟作业的延迟间隔

一般的延迟重复作业的直接调用 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 获取到它的作业匿名函数的实例地址,做为参数传递进去,从而实现重复投递作业的目的。

分享到: