虽然 QWorker 一直不推荐强行中止一个作业(资源泄露几乎无解),但在实际的操作中,确实存在作业执行过程中,因为某种不可预知的原因而被锁死的问题。为了解决这一问题,QWorker 新的版本增加了相关的属性和事件让用户能够对此进行特殊处理。
要强行结束一个死掉的作业,需要做以下工作:
- 设置 JobFrozenTime 属性,以便 QWorker 能够判断指定的作业是否已经死掉。单位为秒。
- 设置 OnJobFrozen 的事件回调,它会在作业执行 JobFrozenTime 秒后仍未完成时触发。
因为上述实现的逻辑,也就意味着以下两点:
- 如果你的作业执行时间较长,那么定时更新作业的 StartTime 就可以避免被当作僵尸作业。
- 长时间作业因为本身就声明了作业需要较长的时间才能完成,所以不会检查 JobFrozenTime。
如果你已经完全了解上面的说明,那么你需要做的就是在 OnJobFrozen 事件里,调用 AJob.Worker.ForceQuit 来强制结束进程。
procedure TForm1.DoJobFrozen(AJob:PQJob);
begin
AJob.Worker.ForceQuit;
end;
额外补充一点要注意的是,不要试图调用主线程作业的 Worker.ForceQuit,因为那样操作是无意义的,总不能结束主线程,那样程序就不如你直接强制重启程序了。
更多的示例,参考 /Demos/Delphi/QWorker Demos/ForceQuit 内的源码及说明。