Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#2

Re: Komisches Phänomen bei Threads. var array of meinthread.

  Alt 12. Mär 2010, 14:31
Das geht ja gar nicht:

Delphi-Quellcode:
    
fThreadSub[i].Terminate;
FreeAndNil(fThreadSub[i]);
Das Terminate setzt nur das property Terminated auf true. Im Execute muss dieses dann abgefragt und die Methode verlassen werden. Nach ein paar Aufräumarbeiten ist der Thread dann beendet.

Mit dem FreeAndNil direkt hinter Terminate entziehst du dem Thread in den meisten Fällen seinen Speicherbereich bevor er sich beenden konnte.

Als Lösung auf die Schnelle würde ich zwei Schleifen daraus machen: die erste ruft nur Terminate auf, während die zweite für jeden Thread ein WaitFor aufruft und den Thread danach freigibt.

Es ist zwar aus deinem Code nicht ersichtlich, aber ich vermute, du erzeugst die Threads mit FreeOnTerminate=false. Alternativ kannst du die Threads auch mit FreeOnTerminate=true erzeugen und nach dem Terminate einfach den Array-Eintrag auf nil setzen:

Delphi-Quellcode:
    
//Erstellen
SetLength(fThreadSub, 8);
for i:=0 to Length(fThreadSub) do begin
  fThreadSub[i] := TThreadSub.Create;
  fThreadSub[i].FreeOnTerminate := true;
end;

//...
 
//Freigeben
for i:=0 to Length(fThreadSub) do
begin
  fThreadSub[i].Terminate;
end;

for i:=0 to Length(fThreadSub) do
begin
  fThreadSub[i].WaitFor;
  fThreadSub[i] := nil;
end;
Uwe Raabe
  Mit Zitat antworten Zitat