Hab da mal eine Frage zu folgendem minimalen Programmcode mit einem Thread.
Hauptprogramm:
Delphi-Quellcode:
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
myThread: TmyThread;
end;
var
MainForm: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
myThread := TmyThread.Create(true);
myThread.FreeOnTerminate := true;
// myThread.Start;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if (myThread <> nil) then
begin
if not myThread.Suspended then //Thread ist gestartet
begin
myThread.Terminate;
while not myThread.Finished do
sleep(10);
end
else //Thread wurde nicht gestartet
myThread.Free;
end;
end;
Thread:
Delphi-Quellcode:
type
TmyThread = class(TThread)
protected
procedure Execute; override;
end;
implementation
procedure TmyThread.Execute;
begin
while not Terminated do
begin
Sleep(50);
end;
end;
Es geht dabei um die Frage was korrekterweise im FormClose stehen müsste. Wenn der Thread gestartet ist, alles ok. Wenn aber nicht, dann befindet sich der Thread bei Close im suspended-Zustand. myThread.Free bring eine
Exception 'Thread Error: Das
Handle ist ungültig'. Ohne myThread.Free gibt es ein Memory Leakage.
Wie kann man das Leakage vermeiden, also das Objekt korrekt freigeben?
Er wollte so richtig in Delphi einsteigen. Nun steckt er ganz tief drin ...