Hallo,
ich weiß nicht mehr weiter..
Ich habe einen Threadpool (poolsize = 2xcpuCount).
Delphi-Quellcode:
procedure TThreadpool.Execute;
var
i: Byte;
begin
while not terminated
do
begin
try
if (fRunningTasks.count < fPoolSize)
and (fTaskList.Count > 0)
then
begin
fRunningTasks.Insert(0,fTaskList[0]);
fTaskList.Delete(0);
fRunningTasks[0].Start;
end;
except
on E:
Exception do
fLogger.add(1,format('
%s: Error while inserting task: %s',[self.ClassName,E.
Message]));
end;
try
if fRunningTasks.count > 0
then
for i:= fRunningTasks.Count -1
downto 0
do
begin
if fRunningTasks[i].finished
then
begin
fRunningTasks[i].Free;
fRunningTasks.Delete(i);
end;
end;
sleep(50);
except
on E:
Exception do
fLogger.add(1,format('
%s: Error while deleting tasks: %s',[self.ClassName, E.
Message]));
end;
end;
end;
Die Tasks sind auch Threads (freeOnTerminate = false).
fRunningTasks ist eine generische TList.
Ich weiß es ist nicht optimal die laufenden Threads in einer Schleife zu überwachen..
Die Tasks werden alle 5 Minuten ausgeführt.
Es werden 173 Tasks abgearbeitet.
Nach jedem Durchlauf erhöht sich die Anzahl der Handles im Windows TaskManager um 173.
Der "Speicherverbrauch" um ca 300kByte.
Die Anzahl der Thread geht aber nachdem ein Durchlauf beendet wurde wieder auf den Normalwert (2) zurück.
Meiner Meinung nach, werden die Tasks(Threads) ordnungsgemäß beendet.
Warum erhöht sich dann noch die Anzahl der Handles?
Grüße
Klaus