【问题描述】
该问题是由于在TQRepeatJobs.InternalPop函数在弹出作业时,忘记设置弹出作业的Next为空引起的。下面的代码可以简单的触发该问题:
Workers.Post(DoNullJob, 10000, Pointer(1)); Workers.Post(DoNullJob, 10000, Pointer(2)); Workers.Post(DoNullJob, 10000, Pointer(3));
问题代码
function TQRepeatJobs.InternalPop: PQJob;
...
if AJob.Runonce then
Result := AJob
else
begin
AJob.Next:=nil;<-- 少了这句 -->
Inc(AJob.NextTime, AJob.Interval);
Result := JobPool.Pop;
...由于该问题,会造成TQRepeatJobs的作业链表出错,在触发作业的AfterRun时更新原始作业状态时陷入死循环,多次重复后,会耗尽所有的Worker资源,造成无法处理任何作业。
【严重级别】
高
【更新级别】
立即更新
【特别感谢】
简单生活、厦门小叶报告此问题。
