You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:47:39