QWorker 更新 – TQJob 增加 Handle 属性

【更新说明】

根据 恢宏和音儿小白的建议,为 TQJob 加入了一个 Handle 属性,它对应的是你提交作业时返回的句柄的值。如果是一个空的未提供作业或者简单作业,返回的是实例本身的地址。

这个句柄可以用在 ClearSingleJob 等需要取消作业的场合,为了避免在作业中取消句柄对应的作业时,由于需要等待自身退出而造成无法完成 ClearSingleJob 操作,加入了一个 AWaitForRunningDone 参数,以决定是否等待所有正在运行子作业完成,下面是一段相关功能的测试代码。

procedure TForm1.btnHandleTestClick(Sender: TObject);
var
  AHandle: IntPtr;
  T, APlanStart: Cardinal;
  ADone: Boolean;
begin
btnHandleTest.Enabled := false;
btnHandleTest.Caption := '测试简单作业';
ADone := false;
// Simple Jobs
AHandle := Workers.Post(
  procedure(AJob: PQJob)
  begin
  if AHandle <> AJob.Handle then
    ShowMessage('Error')
  else
    ShowMessage('Simple:' + IntToStr(AJob.Handle));
  ADone := True;
  end, nil, True);
while not ADone do
  Application.ProcessMessages;
btnHandleTest.Caption := '测试重复作业';
// Repeat Jobs
ADone := false;
AHandle := Workers.Post(
  procedure(AJob: PQJob)
  begin
  Workers.ClearSingleJob(AJob.Handle, false);
  if AJob.Handle <> AHandle then
    ShowMessage('Error')
  else
    ShowMessage('Repeat:' + IntToStr(AJob.Handle));
  ADone := True;
  end, 100, nil, True);
while not ADone do
  Application.ProcessMessages;
btnHandleTest.Caption := '测试信号作业';
// Signal Job
ADone := false;
AHandle := Workers.Wait(
  procedure(AJob: PQJob)
  begin
  Workers.ClearSingleJob(AJob.Handle, false);
  if AHandle <> AJob.Handle then
    ShowMessage('Error')
  else
    ShowMessage('Signal:' + IntToStr(AJob.Handle));
  ADone := True;
  end, FSignalId, True);
while not ADone do
  Application.ProcessMessages;
// Plan Job
btnHandleTest.Caption := '计划作业-60秒';
ADone := false;
AHandle := Workers.Plan(
  procedure(AJob: PQJob)
  begin
  Workers.ClearSingleJob(AJob.Handle, false);
  if AHandle <> AJob.Handle then
    ShowMessage('Error')
  else
    ShowMessage('Plan:' + IntToStr(AJob.Handle));
  ADone := True;
  end, '*', nil, True);
T := GetTickCount;
APlanStart:=T;
while not(ADone or Application.Terminated) do
  begin
  if GetTickCount - T > 1000 then
    begin
    if GetTickCount - APlanStart < 60000 then
      btnHandleTest.Caption := '计划作业-' +
        IntToStr(60 - (GetTickCount - APlanStart) div 1000) + '秒'
    else
      btnHandleTest.Caption := '测试计划作业';
    T := GetTickCount;
    end;
  Application.ProcessMessages;
  end;
btnHandleTest.Caption:='句柄测试';
btnHandleTest.Enabled := True;
end;

本次更新还更改了EnumJobStates函数来加入对计划任务作业的支持及其它小改。

【更新级别】

可选

【特别感谢】

恢弘、音儿小白

 

分享到: