AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Nach Thread Terminate Friert mein Programm ein Warum?
Thema durchsuchen
Ansicht
Themen-Optionen

Nach Thread Terminate Friert mein Programm ein Warum?

Ein Thema von CrashBack · begonnen am 21. Mai 2010 · letzter Beitrag vom 21. Mai 2010
Antwort Antwort
Benutzerbild von CrashBack
CrashBack

Registriert seit: 17. Dez 2007
Ort: Norge Oslo
58 Beiträge
 
#1

Nach Thread Terminate Friert mein Programm ein Warum?

  Alt 21. Mai 2010, 19:51
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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Nach Thread Terminate Friert mein Programm ein Warum?

  Alt 21. Mai 2010, 20:11
Ü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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 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
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Nach Thread Terminate Friert mein Programm ein Warum?

  Alt 21. Mai 2010, 20:28
Eventuell wäre das was für dich: http://www.michael-puff.de/Programmi...rials/Threads/
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von CrashBack
CrashBack

Registriert seit: 17. Dez 2007
Ort: Norge Oslo
58 Beiträge
 
#5

Re: Nach Thread Terminate Friert mein Programm ein Warum?

  Alt 21. Mai 2010, 20:56
Danke für die vielen Antworten. Ich werd mal das so versuchen und ich werde mir das Beispiel von hier Ansehen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:26 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