Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Frage zu Threads (https://www.delphipraxis.net/28583-frage-zu-threads.html)

Rakshasa 26. Aug 2004 16:30


Frage zu Threads
 
Hi!!

Ich habe mir Luckie's geniales Thread Turtorial mal angeschaut und mir meinen Thread danach (so weit ich's verstanden habe .. :) gebastelt.

Frage an die Leute, die etwas mehr davon verstehen als ich:

Ist meine Art de Thread Aufrufs "richtig" (funktionieren tuts), ergo wird alles freigegeben was initialisiert wurde etc.?

Code:
type
  TMeinThread = class(TThread)
  protected
    procedure Execute; override;
  end;

...

procedure TMeinThread.Execute;
begin

  FreeOnTerminate:=True;
 ...
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MeinThread: TMeinThread;
begin
  MeinThread:=TMeinThread.Create(False);
end;
Gerade nach dem .Create, muß ich da nicht irgendwie den Thread auflösen oder tut er das von selbst?! %-)

Luckie 26. Aug 2004 16:34

Re: Frage zu Threads
 
Ich würde das FreeOnTerminate in die ButtonClick Methode nehmen vor dem Erzeugen des Threads.

Fossibaer58809 26. Aug 2004 16:41

Re: Frage zu Threads
 
Zitat:

Zitat von Luckie
Ich würde das FreeOnTerminate in die ButtonClick Methode nehmen vor dem Erzeugen des Threads.

Wirklich vor dem Erzeugen :-D

Gruß

Michael

Luckie 26. Aug 2004 16:43

Re: Frage zu Threads
 
Klar. Das Objekt MeinThread existiert doch schon.

Niko 26. Aug 2004 16:44

Re: Frage zu Threads
 
Hi
Zitat:

Zitat von Rakshasa
Gerade nach dem .Create, muß ich da nicht irgendwie den Thread auflösen oder tut er das von selbst?!

Da du FreeOnTerminate auf true setzt, gibt er sich selber frei, sobald die Execute-Methode beendet wird.

Allerdings wäre es sauberer das FreeOnTerminate entweder im ButtonClick zu setzen oder in einem überschriebenen Konstruktor im Thread-Objekt.

Setzen im OnClick:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  MeinThread: TMeinThread;
begin
  // Thread angehalten erzeugen, damit er nicht schon zu Ende ist, bevor FreeOnTerminate auf true gesetzt wurde
  MeinThread:=TMeinThread.Create(true);  
  MeinThread.FreeOnTerminate := true;
  // Thread-Ausführung starten
  MeinThread.Resume;
end;
Außerdem ist die Variable MeinThread ein bisschen ungünstig deklariert, denn nach dem Ende von ButtonClick hast du keine Möglichkeit mehr, auf das Thread-Objekt zuzugreifen.

[EDIT] Execute in Resume geändert - hatte das Execute noch irgendwie im Hinterkopf ... [/EDIT]

Luckie 26. Aug 2004 16:47

Re: Frage zu Threads
 
Man kann auch die Eigenschaften vor dem Aufruf der Methide Create setzten, dann spart man sich den Aufruf von Execute.

Und wenn er nicht mehr auf das Thread-Objekt zugreifen muss ist das doch kein Problem.

Fossibaer58809 26. Aug 2004 16:49

Re: Frage zu Threads
 
Zitat:

Zitat von Luckie
Klar. Das Objekt MeinThread existiert doch schon.

Ähmmm.. ich glaube ich muss meine Brille mal putzen :cry:
Aber ich sehe da nur eine nicht initialisierte Variable. Und wenn ich dann auf eine Eigenschaft zugreife gibts bei mir eine hübsche AV. :twisted:

Michael

Luckie 26. Aug 2004 16:50

Re: Frage zu Threads
 
Mist, stimmt. :oops:

Aber starten tut man eine Thread mit 8oh]Resume[/oh]:
Delphi-Quellcode:
    // Thread pausiert erzeugen, um weiter Initialisierungen vornehmen zu können
    ThreadArray[Loop] := TMyThreads.Create(True);
    // Listviewzeilenindex übergeben
    ThreadArray[Loop].FIndex := Loop;
    // Priorität festlegen
    ThreadArray[Loop].Priority := tpIdle;
    // Thread gibt den Speicher, wenn er fertig ist selber wieder frei
    ThreadArray[Loop].FreeOnTerminate := True;
    // und los
    ThreadArray[Loop].Resume;

Fossibaer58809 26. Aug 2004 16:54

Re: Frage zu Threads
 
Ich würde ganz einfach in der ja schon abgeleiteten Klasse TMeinThread den Konstruktor Create überschreiben und das FreeOnTerminate dort setzen. Dann kann ich den Thread starten ohne Ihn auf suspended zu setzen und brauch Ihn uach nicht mit resume starten.
Ob die Methode Execute aus dem MainThread aufgerufen werden kann ist mir gerade nicht bewusst. Doch könnte ich mir vorstellen, dass dann der Thread immer noch schön schläft und die Execute vom MainThread ausgeführt wird :mrgreen:

Michael

Luckie 26. Aug 2004 16:57

Re: Frage zu Threads
 
Zitat:

Zitat von Fossibaer58809
Ich würde ganz einfach in der ja schon abgeleiteten Klasse TMeinThread den Konstruktor Create überschreiben und das FreeOnTerminate dort setzen. Dann kann ich den Thread starten ohne Ihn auf suspended zu setzen und brauch Ihn uach nicht mit resume starten.

@Namensvetter: Das wäre die elegantere Methode.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:04 Uhr.
Seite 1 von 2  1 2      

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