![]() |
Nach Thread Terminate Friert mein Programm ein Warum?
Ich habe mal son bisl Rumgespielt mit dem thema Thread. Es Läuft auch so weit nur wenn ich auf Thread Beenden klick dann hängt das Programm sich auf, Naja besser Gesagt es Friert ein. Hab mir das Beispiel auf
![]() Was mach ich Falsch? (Bevor es wieder Beschwerden hagelt mit meinem Deutsch ich bin Norweger und Behersche das Deutsch nicht zu 100% und da es Auf Norwegisch solche guten Foren nicht giebt. Bin ich hier. Ich hoffe man Vergiebt mir.)
Delphi-Quellcode:
var
Form1: TForm1; MyThread : TMyThread; implementation {$R *.dfm} procedure TMyThread.execute; var I: Integer; Event : TEvent; begin while (not Terminated) do for I := 0 to 256 - 1 do begin form1.caption := inttostr(i); end; end; procedure TForm1.Button1Click(Sender: TObject); begin MyThread.execute; end; procedure TForm1.Button2Click(Sender: TObject); begin with MyThread do begin WaitFor; Free; end; end; procedure TForm1.FormCreate(Sender: TObject); begin MyThread := TMyThread.Create(true); MyThread.FreeOnTerminate := True; MyThread.Resume; MyThread.Suspend; MyThread.Terminate; end; |
Re: Nach Thread Terminate Friert mein Programm ein Warum?
Überlege mal, was du im OnCreate machst:
Threadobjekt angehalten erstellen. Freigeben bei Beendigung. Thread starten. Thread anhalten. Thread terminieren. Ich weiß nicht, ob das dein Problem löst, aber passen tut es nicht. |
Re: Nach Thread Terminate Friert mein Programm ein Warum?
Hier irgendwo in der DP gibt es (glaub ich) auch ein sehr gutes TThread-Tutorial.
Delphi-Quellcode:
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.
procedure TForm1.Button1Click(Sender: TObject);
begin MyThread.execute; end;
Delphi-Quellcode:
Auf was wartets du denn?
procedure TForm1.Button2Click(Sender: TObject);
begin with MyThread do begin WaitFor; Free; end; end; Genau, auf das Ende, aber du hast vergessen zu sagen, daß der Thread sich beenden soll. :zwinker: also:
Delphi-Quellcode:
with MyThread do
begin Terminate; WaitFor; Free; end;
Delphi-Quellcode:
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.
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;
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. |
Re: Nach Thread Terminate Friert mein Programm ein Warum?
Eventuell wäre das was für dich:
![]() |
Re: Nach Thread Terminate Friert mein Programm ein Warum?
Danke für die vielen Antworten. Ich werd mal das so versuchen und ich werde mir das Beispiel von
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz