Низкое использование процессора Delphi во время многопоточности

Во время выполнения многопоточной программы я вижу 8 потоков, запускающихся в журнале событий Delphi.

(Мой ЦП - это Intel 7 с 4 ядрами HyperThreaded с 8 вычислительными ядрами), но в моем TaskManager на вкладке «Производительность» я вижу только 12% использования ЦП и только одно ядро, рассчитывающее с производительностью до 70–80%. Скомпилировал мою многопоточную программу с использованием OTL и с использованием ParallelFor, но все еще только 12% производительности и только одно ядро, выполняющее работу.

В моей форме Form1 у меня есть процедура ButtonClick с OTL parallel.ForeEach, которая перебирает элементы StingList. Строки StringList содержат каждое имя, путь к другому файлу данных и формат данных файла. ForEach.execute () запускает процедуру EntrySearch на другом модуле, процедура EntrySearch начинается с извлечения информации из соответствующей строки списка строк. В цикле «Пока X <Y» данные извлекаются из DataFile через AssignFile и, пока не eof, читают строки с данными. Расчеты производятся для данных до тех пор, пока не закончится цикл «Пока X <Y»

Я вижу, что 8 (CPUcount) потоков запускаются при процедуре ButtonClick. В TaskManager я вижу, что только одно ядро ​​ЦП начинает работать всего около 12% ProcessorUsage. Когда после вычислений 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;

Что идет не так? и как я могу решить это. Большое спасибо.

Ответы на вопрос(0)

Ваш ответ на вопрос