![]() |
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:
Gerade nach dem .Create, muß ich da nicht irgendwie den Thread auflösen oder tut er das von selbst?! %-)
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; |
Re: Frage zu Threads
Ich würde das FreeOnTerminate in die ButtonClick Methode nehmen vor dem Erzeugen des Threads.
|
Re: Frage zu Threads
Zitat:
Gruß Michael |
Re: Frage zu Threads
Klar. Das Objekt MeinThread existiert doch schon.
|
Re: Frage zu Threads
Hi
Zitat:
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:
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.
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; [EDIT] Execute in Resume geändert - hatte das Execute noch irgendwie im Hinterkopf ... [/EDIT] |
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. |
Re: Frage zu Threads
Zitat:
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 |
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; |
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 |
Re: Frage zu Threads
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 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