使用单工作线程TThreadPool限制TTask串行执行是否可行?
结论
该方案可以实现你预期的同一时间仅执行一个缩略图生成任务的效果。
原理说明
Delphi中自定义TThreadPool实例设置SetMaxWorkerThreads(1)后,所有提交到该线程池的任务都会被串行调度,同一时间永远只会有1个任务处于运行状态,剩下的任务会进入待执行队列排队等待,完全匹配你的缩略图生成逻辑不支持并发的需求。
注意事项
为了避免逻辑异常,你需要注意以下几点:
- 确保所有缩略图生成的
TTask都提交到这个专用的ThumbnailTaskThreadPool,不要误传默认线程池,否则仍会出现并发问题 - 调用
TTask.Run时必须使用带线程池参数的重载,示例代码参考:TTask.Run(procedure begin // 你的缩略图生成逻辑 end, ThumbnailTaskThreadPool); - 应用退出时需要正确释放线程池资源,释放前建议先等待队列中所有待执行任务完成,避免程序退出时抛出未处理异常
- 如果你需要验证逻辑是否生效,可以加个简单的并发校验逻辑:
var ThumbnailTaskRunning: Boolean = False; // 任务内部逻辑 if ThumbnailTaskRunning then begin // 打错误日志,出现意外并发 end; ThumbnailTaskRunning := True; try // 缩略图生成逻辑 finally ThumbnailTaskRunning := False; end;
内容的提问来源于stack exchange,提问作者Trey Thrasher
相关产品推荐
相关产品推荐

