Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 多线程期间Delphi CPU使用率低_Multithreading_Performance_Delphi_Otl - Fatal编程技术网

Multithreading 多线程期间Delphi CPU使用率低

Multithreading 多线程期间Delphi CPU使用率低,multithreading,performance,delphi,otl,Multithreading,Performance,Delphi,Otl,在执行多线程程序的过程中,我在Delphi事件日志中看到8个线程开始 我的CPU是Intel 7,4核超线程,因此有8个计算核,但在我的TaskManager的“性能”选项卡上,我看到只有12%的CPU使用率,只有一个核的计算性能高达70-80%。我确实使用OTL和ParallelFor编译了我的多线程程序,但仍然只有12%的性能,只有一个内核在工作 在我的表单1中,我有一个带有OTL parallel.foreach的ButtonClick过程,它迭代StingList中的项。 StringL

在执行多线程程序的过程中,我在Delphi事件日志中看到8个线程开始

我的CPU是Intel 7,4核超线程,因此有8个计算核,但在我的TaskManager的“性能”选项卡上,我看到只有12%的CPU使用率,只有一个核的计算性能高达70-80%。我确实使用OTL和ParallelFor编译了我的多线程程序,但仍然只有12%的性能,只有一个内核在工作

在我的表单1中,我有一个带有OTL parallel.foreach的ButtonClick过程,它迭代StingList中的项。 StringList行包含每个文件的名称、不同数据文件的路径和文件的数据格式。 ForEach.execute在其他单元上启动“EntrySearch”过程, EntrySearch过程从Stringlist的适当行提取信息开始。 在“While X 我可以看到在ButtonClick过程中启动了8个CPUcount线程。在TaskManager中,我只看到一个CPU核心开始工作,处理器使用率总计约为12%。 当计算完成后,ProcessorUsage返回到0%时,.exe程序将挂起,我无法控制该程序。 从CalculationUnit中提取的少量数据中,我只从最后一个启动的线程中获取数据,因为最后一个线程使其他线程停止,无法进行计算,也无法终止

{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;
出了什么问题?我怎样才能解决这个问题。
非常感谢。

第一句话有误导性。您的意思是在程序执行期间,而不是在编译期间。为什么您的程序不能并行执行?可以在您的程序中找到答案。您需要显示一个@David Hefferman,谢谢,已将编译更改为执行。请尝试使用其他内存管理器,例如scalemm或synscalemm。还可以尝试在Windows上使用线程池和IOCP。@在非常有帮助的地方添加您的注释!非常感谢。通过您提供的调试链接,我发现我的问题确实是全局变量。我的计算过程是在一个单独的单元上进行的,认为整个单元都包含在线程中。现在我把所有变量都放在程序中,我的问题就解决了。我学到了很多!再次感谢,向弗里茨致以最良好的问候