Delphi中TThreadPool性能随时间下降?求解决方案
Delphi线程池CPU占用率异常下降问题分析与解决
我用Delphi 10.4编写了一段使用线程池执行任务的代码,初始CPU占用约70%,但运行数分钟后会降至20%以下,且这个现象和任务本身的执行代码无关。重建线程池后CPU占用率会恢复到70%。升级到Delphi 11.3后表现不同,CPU占用率稳定在约80%且效率更高。请问这是Delphi的Bug还是预期行为?除了重建线程池,还有其他修复或缓解方法吗?
测试代码
type TParallel = class(TThread) strict protected procedure Execute; override; end; var Parallel: TParallel; Recreate: Boolean; procedure TParallel.Execute; function Task(const ThreadPool: TThreadPool): ITask; begin Result := TTask.Create( procedure const N = 10000; var I: Integer; begin for I := 1 to N do Random(10000); // 示例无意义代码 end, ThreadPool); end; const N = 12; // 任意设定的任务数量 var I: Integer; Tasks: TArray<ITask>; ThreadPool: TThreadPool; begin Randomize; ThreadPool := TThreadPool.Create; SetLength(Tasks, N); try while not Terminated do begin if Recreate then begin Recreate := False; ThreadPool.Free; ThreadPool := TThreadPool.Create; end; for I := 0 to N - 1 do begin Tasks[I] := Task(ThreadPool); Tasks[I].Start; end; TTask.WaitForAll(Tasks); end; finally ThreadPool.Free; end; end; procedure TForm1.Button3Click(Sender: TObject); begin if Parallel = nil then Parallel := TParallel.Create(False); end; procedure TForm1.Button8Click(Sender: TObject); begin if Parallel <> nil then FreeAndNil(Parallel); end; procedure TForm1.Button9Click(Sender: TObject); begin Recreate := True; end;
问题结论
这是Delphi 10.4的已知Bug,并非预期行为。在Delphi 11.3及后续版本中,官方已经修复了线程池的调度逻辑问题,不仅解决了CPU占用率异常下降的现象,还提升了任务执行的整体效率。
修复/缓解方法
- 升级Delphi版本:直接升级到11.3及以上版本,这是最彻底的解决方案,官方修复从根源上解决了线程池调度异常的问题。
- 固定线程池工作线程数:在Delphi 10.4中,创建线程池后手动设置
MinWorkerThreads和MaxWorkerThreads属性,强制维持足够的活跃线程数量,避免线程池自动缩减线程导致CPU利用率下降。示例代码:ThreadPool := TThreadPool.Create; ThreadPool.MinWorkerThreads := 12; // 与任务数量匹配 ThreadPool.MaxWorkerThreads := 12; - 定期重建线程池:如果无法升级版本,除手动触发重建外,可在代码中添加定时逻辑,周期性重建线程池,以此维持CPU的高利用率。
内容的提问来源于stack exchange,提问作者hundreAd
相关产品推荐
相关产品推荐

