[QWorker] Delay 函数新增 ARepeat 参数用来实现重复延迟作业

栏目: 编程语言 · 发布时间: 8年前

内容简介:[QWorker] Delay 函数新增 ARepeat 参数用来实现重复延迟作业

QWorker 提供了多种重复作业的支持,但是,如果一个作业执行的时间超过了重复间隔,下一次作业不会等待上一次作业结束就会执行,这在某些需求场景下会造成不便。以前我建议大家用人工调用 Delay 的方式来解决这一问题,现在不需要了,QWorker 的 Delay 函数增加了这样一个参数,来简化您的编程:

先看一下函数声明:

Delphi/Pascal

function Delay(AProc: TQJobProc; ADelay: Int64; AData: Pointer;ARunInMainThread: Boolean = False;AFreeType: TQJobDataFreeType = jdfFreeByUser; ARepeat: Boolean = False): IntPtr; overload;
function Delay(AProc: TQJobProcA; ADelay: Int64; AData: Pointer;ARunInMainThread: Boolean = False;AFreeType: TQJobDataFreeType = jdfFreeByUser; ARepeat: Boolean = False): IntPtr; overload;
function Delay(AProc: TQJobProcG; ADelay: Int64; AData: Pointer;ARunInMainThread: Boolean = False;AFreeType: TQJobDataFreeType = jdfFreeByUser; ARepeat: Boolean = False): IntPtr; overload;
function Delay(AProc: TQJobProc; ADelay: Int64; AData: Pointer;ARunInMainThread: Boolean = False;AFreeType: TQJobDataFreeType = jdfFreeByUser; ARepeat: Boolean = False): IntPtr; overload;
function Delay(AProc: TQJobProcA; ADelay: Int64; AData: Pointer;ARunInMainThread: Boolean = False;AFreeType: TQJobDataFreeType = jdfFreeByUser; ARepeat: Boolean = False): IntPtr; overload;
function Delay(AProc: TQJobProcG; ADelay: Int64; AData: Pointer;ARunInMainThread: Boolean = False;AFreeType: TQJobDataFreeType = jdfFreeByUser; ARepeat: Boolean = False): IntPtr; overload;

为了保证以前代码的兼容性,ARepeat 参数放在了最后。 参数默认为 False,即单次延迟作业。如果设置为 True,则作业会在上一次完成后,延迟 ADelay 时长,然后再次触发新的作业。如下面的示例代码:

Delphi/Pascal

procedure TForm4.Button2Click(Sender: TObject);
begin
  Workers.Delay(
    procedure(AJob: PQJob)
    begin
      Memo1.Lines.Add(FormatDateTime('hh:nn:ss.zzz', Now) + ' Job started');
      Sleep(2000);
    end, Q1Second, nil, True,jdfFreeByUser,True);
  Memo1.Lines.Add(FormatDateTime('hh:nn:ss.zzz', Now) + ' Job posted.')
end;
procedure TForm4.Button2Click(Sender: TObject);
begin
  Workers.Delay(
    procedure(AJob: PQJob)
    begin
      Memo1.Lines.Add(FormatDateTime('hh:nn:ss.zzz', Now) + ' Job started');
      Sleep(2000);
    end, Q1Second, nil, True,jdfFreeByUser,True);
  Memo1.Lines.Add(FormatDateTime('hh:nn:ss.zzz', Now) + ' Job posted.')
end;

作业要求重复延迟 1 秒后执行,但由于作业内部耗时超过了 1 秒( Sleep 了2秒),所以作业的实际时间间隔就会是第一次是延迟1秒后执行,以后每隔3秒执行一次。我们看一下实际的运行效果截图:

[QWorker] Delay 函数新增 ARepeat 参数用来实现重复延迟作业

从第一行 Job posted 提示到作业开始执行间隔是1秒,而后面的间隔就是3秒,正好符合我们的预期。

好了,我们可以看到它和 Post/At/Plan 一个重复作业的区别就在这里了,Delay 会等待上一次作业完成才计划下一次作业,如果上一次作业始终未完成,下一次也就始终不会开始,而其它类型的重复作业不会管你上次是否完成,没完成到了时间也会开始新的作业。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ACM国际大学生程序设计竞赛题解

ACM国际大学生程序设计竞赛题解

赵端阳//袁鹤 / 电子工业 / 2010-6 / 38.00元

《ACM国际大学生程序设计竞赛题解(1)》可以作为高等院校有关专业的本科和大专学生参加国际大学生程序设计竞赛的辅导教材,或者作为高等院校数据结构、C/C++程序设计或算法设计与分析等相关课程的教学参考书。随着各大专院校参加ACM/ICPC热情的高涨,迫切需要有关介绍ACM国际大学生程序设计竞赛题解的书籍。《ACM国际大学生程序设计竞赛题解(1)》根据浙江大学在线题库的前80题,进行了解答(个别特别......一起来看看 《ACM国际大学生程序设计竞赛题解》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具