Einzelnen Beitrag anzeigen

UliBru

Registriert seit: 10. Mai 2010
155 Beiträge
 
Delphi 11 Alexandria
 
#1

Freigeben eines suspended Threads

  Alt 27. Apr 2012, 10:40
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 ...
  Mit Zitat antworten Zitat