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 Frage zu Thread.Destroy und Objekten (https://www.delphipraxis.net/125544-frage-zu-thread-destroy-und-objekten.html)

Assertor 8. Dez 2008 10:18


Frage zu Thread.Destroy und Objekten
 
Hi,

die Frage ist etwas :oops: aber besser Frage ich nochmal nach, um mir Klarheit zu verschaffen:

Wird Threadn.Destroy eines TThread wirklich im Bereich des VCL MainThreads abgewickelt wird? Wenn ich mir im .Destory per GetCurrentThreadID die ID hole, ist diese nicht die des VCL MainThreads.

Was ist denn jetzt der beste, übliche Weg, Objekte für den Thread bereitzustellen und freizugeben? Alles im .Execute oder - so wie ich es seit langem mache - in Threadn.Create (ist ja VCL scope) und .Destroy?

Gruß Assertor

jbg 8. Dez 2008 11:12

Re: Frage zu Thread.Destroy und Objekten
 
Zitat:

Zitat von Assertor
Wird Threadn.Destroy eines TThread wirklich im Bereich des VCL MainThreads abgewickelt wird? Wenn ich mir im .Destory per GetCurrentThreadID die ID hole, ist diese nicht die des VCL MainThreads.

TThread.Destroy wird in dem Thread ausgeführt der es aufruft. Und wenn du FreeOnTerminate=True gesetzt hast, dann wird das noch im TThread.ThreadId Thread ausgeführt. Wenn du den Code zwingend im Hauptthread ausführen musst, kannst du OnTerminate ein Event zuweisen das die Arbeit verrichtet. Das Event ist deswegen notwendig, weil CallOnTerminate nicht virtuell ist und die Methode DoTerminate im Thread ausgeführt wird.

Assertor 8. Dez 2008 11:17

Re: Frage zu Thread.Destroy und Objekten
 
Hi Andreas,

danke für das erklären!

Ich habe gerade mal etwas rumgesucht und finde viele Beispiele (z.B. auch im artverwandten Tutorial zu TMREWS und dem zugehörigen CodeCentral Item), wo explizit im Source steht:

Delphi-Quellcode:
destructor TWorkerThread.Destroy;
begin
  Main.ThreadDone; //Legit to call VCL, since we're back in main thread
  inherited;
end;
Das ganze von Justin Swett, inzwischen Sr. QA Engineer bei CG. So etwas verwirrt...

Also die Objekte besser im .Execute erzeugen und freigeben.

Gruß Assertor

Edit: Nachtrag, jetzt sehe ich wieder klar... Wenn das TThread Objekt per .Free freigeben wird, läuft das .Destroy im MainThread Kontext ab, bei FreeOnTerminate innerhalb des Threads. Logisch... :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 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