【问题描述】
该问题是由于在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资源,造成无法处理任何作业。
【严重级别】
高
【更新级别】
立即更新
【特别感谢】
简单生活、厦门小叶报告此问题。