Низкое использование процессора 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 Я вижу, что 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;