Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Nach Thread Terminate Friert mein Programm ein Warum? (https://www.delphipraxis.net/151536-nach-thread-terminate-friert-mein-programm-ein-warum.html)

CrashBack 21. Mai 2010 19:51


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 http://wiki.delphigl.com/index.php/T...Multithreading als Vorlage Genutzt.


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;

Luckie 21. Mai 2010 20:11

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.

himitsu 21. Mai 2010 20:17

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:
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. :zwinker:

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.

Luckie 21. Mai 2010 20:28

Re: Nach Thread Terminate Friert mein Programm ein Warum?
 
Eventuell wäre das was für dich: http://www.michael-puff.de/Programmi...rials/Threads/

CrashBack 21. Mai 2010 20:56

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 hier Ansehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz