在按钮上单击“我创建3个带有空过程的任务”,然后将与方法调用和完成的任务列表的时差写入控制台:
procedure TWinTest.BtnThreadTestClick(Sender: TObject);
var
aTasks: array of ITask;
aStart: Cardinal;
begin
aStart := GetTickCount;
Setlength(aTasks, 3);
aTasks[0] := TTask.Create(procedure() begin
end);
aTasks[0].Start;
aTasks[1] := TTask.Create(procedure() begin
end);
aTasks[1].Start;
aTasks[2] := TTask.Create(procedure() begin
end);
aTasks[2].Start;
TTask.WaitForAll(aTasks);
Writeln( GetTickCount - aStart, 'ms');
end;
第一次通话耗时31毫秒,连续通话耗时0毫秒。
为什么第一个通话比连续通话慢?也许delphi会缓存该线程并在后续调用中重用它?
答案 0 :(得分:4)
是的,默认情况下将任务线程缓存(在线程池中)。这被记录的行为:
Tutorial: Using Tasks from the Parallel Programming Library
本教程介绍了如何使用并行编程库(PPL)中的tasks实现应用程序。 Tasks是队列中的工作单元,在CPU时间可用时开始工作。 Tasks可以并行运行操作。 有一个主线程管理该队列,并从thread-pool分配线程来完成任务。 thread-pool的线程数取决于可用的CPU数量。
您可以通过创建TThreadPool
对象并将其传递给TTask
构造函数来自定义池的行为:
如果需要,还可以为Create提供一个参数TThreadPool,TTask的实例可以从中提取所需的线程资源。在不指定TThreadPool实例的情况下,资源是根据平台的CPU和线程功能从默认值中提取的。