【更新说明】
根据 恢宏和音儿小白的建议,为 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函数来加入对计划任务作业的支持及其它小改。
【更新级别】
可选
【特别感谢】
恢弘、音儿小白