ich würde gern wissen, ob ein von mir erzeugter Thread tatsächlich bei "FreeOnTerminated" wieder frei gegeben worden ist. Das sollte nach dem Wiki eigentlich so sein: "Eine andere wichtige Eigenschaft (property) von TThread ist FreeOnTerminate. Wenn diese Eigenschaft auf True gesetzt ist, wird der Thread automatisch freigegeben (wie ein Aufruf von .Free), wenn Execute beendet wird." Leider kann ich HeapTrc nicht einsetzen, aufgrund von Zugriffsverletzungen.
Folgendes Bsp läuft durch, obwohl es mMn eine Zugriffsverletzung geben müsste:
Code: Alles auswählen
type
TMyThread = class(TThread)
private
procedure WriteInMemo;
public
aStr: String;
procedure Execute; override;
end;
...
procedure TForm1.Button1Click(Sender: TObject);
var
aThread: TMyThread;
begin
aThread:=TMyThread.Create(True);
aThread.FreeOnTerminate:=True;
aThread.aStr:='Test';
aThread.Execute; //lt. Wiki müsste nach Execute-Ende der Thread .terminate und .free aufgerufen werden
aThread.Terminate; //selbst dies führt zu keiner Zugriffsverletzung
// aThread.Free; //Nur wenn ich selber .Free aufrufe, kommt es in der nachfolgenden Zeile zur Zugriffsverletzung
Sleep(100);
aThread.Execute;
end;
{ TMyThread }
procedure TMyThread.WriteInMemo;
begin
Form1.Memo1.Lines.Add(aStr);
end;
procedure TMyThread.Execute;
begin
Synchronize(@WriteInMemo);
// Terminate; //Auch das führt zu keiner Fehlermeldung
end;
Zwei Fragen:
Habe ich einen Denkfehler und mache etwas falsch (wie ich einen Thread per Hand aufräume weiss ich, würde aber möglichst "FreeOnTerminate" nutzen)?
Ist das Verhaten nur bei mir (Win7 64bit, Lazarus 32bit Trunc und 1.2.4 gleiches Verhalten) so oder ist das unter anderen Betriebssystemen genauso?
Vielen Dank fürs miträtseln

Michael