Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#3

Re: Nach Thread Terminate Friert mein Programm ein Warum?

  Alt 21. Mai 2010, 20:17
Hier irgendwo in der DP gibt es (glaub ich) auch ein sehr gutes TThread-Tutorial.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread.execute;
end;
Execute ruft man niemals direkt auf (dieses wird intern von der Threadkomponente aufgerufen ... sonst wurde dieser Code ja im selben Thread (Hauptthread) ausgeführt und nicht in einem eigenem Thread.
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
with MyThread do
begin
  WaitFor;
  Free;
end;
end;
Auf was wartets du denn?
Genau, auf das Ende, aber du hast vergessen zu sagen, daß der Thread sich beenden soll.

also:
Delphi-Quellcode:
with MyThread do
begin
  Terminate;
  WaitFor;
  Free;
end;
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
MyThread := TMyThread.Create(true);
MyThread.FreeOnTerminate := True; // der Thread soll sich selber freigeben
                                    // also ist der Aufruf von MyThread.Free
                                    // in Button2Click ein Fehler
MyThread.Resume; // Thread starten
MyThread.Suspend; // und sofort wieder anhalten.
                     // Wieso?
MyThread.Terminate; // Thread beenden ... passiert nie, da der Thread ja
                     // angehalten (suspended) ist und dieses nicht mitbekommt
end;
PS: Die Codes in TForm1.FormCreate des verlinkten Artikels sind nur Beispielaufrufe, mit ihren Erklärungen was sie machen, und sollen keine zusammenhängende Verwendung darstellen.


Delphi-Quellcode:
// Thread erstellen
MyThread := TMyThread.Create(true); // Thread pausiert erstellen
MyThread.FreeOnTerminate := True;
MyThread.Resume; // Thread starten


// Thread erstellen und sofort starten
MyThread := TMyThread.Create(False);


// Thread anhalten
MyThread.Suspend;


// Thread wieder starten
MyThread.Resume;


// dem Thread sagen, daß er sich beenden soll
MyThread.Terminate;

Das FreeOnTerminate sagt, daß sich das Thread-Objekt selber freigeben soll, sobald der Thread beendet wurde.
Wurde dieses nicht angegeben, muß der Programmierer das Objekt mit .Free freigeben.


PS: Im Thread greift man nie auf die nicht threadsichere VCL zu.
( sowas wie form1.caption := ...; ist also verboten )
Derartige Aufrufe/Befehle muß man via Synchronize mit dem Hauptthread synchronisieren.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat