Низкое использование процессора 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;
Что идет не так? и как я могу решить это. Большое спасибо.