在执行多线程程序期间,我看到在Delphi事件日志中开始的8个线程。
(我的CPU是具有4核HyperThreaded的Intel 7,因此有8个计算内核)但是在性能选项卡的我的TaskManager中,我看到只有12%的CPU使用率,只有一个核心计算性能高达约70-80%。使用OTL使用和ParallelFor使用编译我的多线程程序,但仍然只有12%的性能,只有一个核心正在完成工作。
在我的Form1上,我有一个带有OTL parallel.ForeEach的ButtonClick程序,它迭代StingList的项目。 StringList行包含每个Name,差异DataFile的路径和File的DataFormat。 ForEach.execute()在其他Unit上启动一个EntrySearch'程序, EntrySearch过程首先从Stringlist的适当行中提取信息。 在'而X< Y loop'是通过AssignFile从DataFile中提取的数据,而不是eof,用数据读取行。对数据进行计算,直到“X”和“X”为止。 Ÿ'循环结束
我可以看到在ButtonClick过程中启动了8个(CPUcount)线程。在TaskManager中,我看到只有一个CPU核心开始工作,总共大约12%的ProcessorUsage。 在计算之后,ProcessorUsage返回到0%,.exe程序挂起,我无法控制程序。 从我可以从最后一个启动的线程中提取出来的CalculationUnit I getonly数据的小数据,因为这个最后一个线程使其他线程停止并且无法进行计算并且无法终止。
{the OTL in the ButtonClick procedure}
Parallel.ForEach(0, StrList.Count-1)
.PreserveOrder
.NumTasks(CPUCount)
.NoWait
.Execute(
procedure(const value: integer)
begin
CalcUnit.EntrySearch(value);
end);
{procedure on CalcUnit}
procedure EntrySearch(value: integer);
begin
{extract Name, Path DataFile and DataFormat from StringList}
While X < Y do begin
AssignFile(qMSInputFile7, Path);
{$I-} reset(qMSInputFile7); {$I+}
While Not eof(qMSInputFile7) do Begin
with qMetaRec7 do begin
Read (qMSInputFile7, qMetaRec7);
{ Extract the Data}
end; // While not eof
{Make calculations}
end; // While X<Y
end;
出了什么问题?我该如何解决这个问题。 非常感谢。