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 VCL-Threads mit FreeOnTerminate:=true? (https://www.delphipraxis.net/182813-vcl-threads-mit-freeonterminate-%3Dtrue.html)

Delphi-Laie 19. Nov 2014 18:25

VCL-Threads mit FreeOnTerminate:=true?
 
Hallo Delphifreunde, ich benutze für ein VCL-Progamm das VCL-Thread-Objekt (Datei -> neu -> Thread-Objekt), und zwar vielmals: Etliche Threads werden zur Laufzeit erzeugt und abgearbeitet, und sie enden mit dem Ende ihres jeweiligen Codes selbständig.

Ist es unter diesen Umständen ratsam, FreeOnTerminate:=true zu setzen? Ich tue das gleich am Beginn der überschriebenen Execute-Procedur, fand aber noch keinen auffälligen Unterschied, als wenn ich das weggelassen hätte.

Danke und Gruß

Delphi-Laie

Stevie 19. Nov 2014 18:36

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Wenn du Threads mit "Fire and forget" erstellst (also nicht irgendwo auf ihre Beendigung wartest und sie dann freigibst), erzeugst du mit FreeOnTerminate auf False Memleaks.
Dann wird nämlich die Thread Instanz nicht freigegeben.

Delphi-Laie 19. Nov 2014 18:43

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Danke!

Also, ich erstelle sie mit create, aber nicht mit einem selbstgeschriebenen Konstruktor, sondern eben mit dem, den das VCL-Thread-Objekt bereitstellt: Threadklassenname.create(false). Und beenden tun sie sich von allein, weil eben der jeweilige Code endet.

Wenn ich Dich recht verstand, sollte FreeOnTerminate:=true also besser irgendwo im Threadcode auftauchen, nicht wahr?

Luckie 19. Nov 2014 18:48

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Ja, sollte er. Und zwar beim Erzeugen des Thread-Objekta.

Delphi-Laie 19. Nov 2014 18:50

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Gut, danke Euch beiden! Werde ich ab sofort mich bemühen, auch daran zu denken.

Stevie 19. Nov 2014 19:12

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Beachte aber, dass du auf einen solchen Thread auf keinen Fall irgendwo sowas wie nen WaitFor aufrufst, denn dann knallt es (weil der Thread sich unterm WaitFor wegzerstört oder gar nicht mehr existiert)

Delphi-Laie 19. Nov 2014 19:21

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Soweit sind meine Threadkenntnisse noch nicht. Meine Threads haben, einmal erzeugt, vollauf zu tun, die warten auf nichts.

Sir Rufo 19. Nov 2014 19:31

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Ich kenne keinen VCL-Thread, scheint was neues zu sein :stupid:

Delphi-Laie 19. Nov 2014 19:45

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1280405)
Ich kenne keinen VCL-Thread, scheint was neues zu sein :stupid:

Laufen formularbasierte Delphi-Programme nicht in einem, eben dem VCL-Thread?

Vom VCL-Thread sprach zudem niemand. Ich bezeichnete das von Delphi vorgefertigte Thread-Grundgerüst als VCL-Thread-Objekt, weil Luckie es in seinem Script "Threads unter Delphi" so nannte.

Sir Rufo 19. Nov 2014 19:51

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Nein, es gibt den MainThread und der hat darum auch eine Delphi-Referenz durchsuchenMainThreadID. Mit der VCL hat das rein gar nichts zu tun, denn die VCL bekommt den Thread zugewiesen und weil die VCL nicht threadsafe ist bleibt die da auch gefangen.
Dadurch könnte man fast sagen, dass der VCL-Thread gleich dem MainThread ist. Das macht mich dann aber stutzig wenn dann noch mehr VCL-Threads erzeugt werden sollen.

Ja, da hat der Luckie wohl mal was falsch verstanden, denn das ganze Thread-Gedöns gehört eindeutig zur RTL ;)

himitsu 19. Nov 2014 20:09

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Jupp, es gibt keinen VCL-Thread im Delphi, oder wie kann man den dort auf die Form pappen?
TThread ist und bleibt eine Komponente der RTL.

Abgesehn von TIdThreadComponent der Indy oder einigen Implementationen weiterer Dritthersteller, welche den TThread in einer VCL-Komponente kapseln. (es gibt hier sogar irgendwo noch eine alte Komponente von mir, von vor den anonymen Methoden)

Sir Rufo 19. Nov 2014 20:22

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Irgendwie rechne ich da wohl anders. Jedes Gedöns, was nicht auf die VCL zugreift, also ohne VCL auch zurecht kommt, gehört für mich auch nicht zur VCL.

Stevie 19. Nov 2014 23:40

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1280418)
Irgendwie rechne ich da wohl anders. Jedes Gedöns, was nicht auf die VCL zugreift, also ohne VCL auch zurecht kommt, gehört für mich auch nicht zur VCL.

Das bekommen leider einige nicht richtig auf die Ketten, zwischen RTL und VCL zu unterscheiden, gibt auch einige Delphi Experten, die das dauernd durcheinander werfen ;)

Zitat:

Zitat von himitsu (Beitrag 1280415)
Jupp, es gibt keinen VCL-Thread im Delphi, oder wie kann man den dort auf die Form pappen?
TThread ist und bleibt eine Komponente der RTL.

Abgesehn von TIdThreadComponent der Indy oder einigen Implementationen weiterer Dritthersteller, welche den TThread in einer VCL-Komponente kapseln. (es gibt hier sogar irgendwo noch eine alte Komponente von mir, von vor den anonymen Methoden)

Nur, weil mans als Komponente verpackt, machts das noch lang nicht zur VCL gehörig. :stupid:

Zitat:

Zitat von Delphi-Laie (Beitrag 1280403)
Soweit sind meine Threadkenntnisse noch nicht. Meine Threads haben, einmal erzeugt, vollauf zu tun, die warten auf nichts.

Nicht der Thread, sondern jemand anders könnte auf den Thread warten, dass er fertig wird. Das sollte man nicht mit
Delphi-Quellcode:
FreeOnTerminate := True
kombinieren.

Dejan Vu 20. Nov 2014 04:14

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Wenn ich nicht 100% sicher bin, das mein Thread VOR meiner Anwendung beendet wird, lasse ich das mit dem FreeOnTerminate. Sonst knallt es nämlich beim Beenden der EXE. Also hab ich einen kleinen Threadmanager, der die Threads erzeugt, sie in eine Liste packt und deren OnTerminate jeweils so umbiegt, das sie sich beim beenden wieder aus der Liste entfernen.

Der Manager selbst kann nun beim Beenden ordentlich alle Threads beenden und warten, bis die Liste leer ist. Dann weiß ich nämlich genau, wann was passiert.

Luckie 20. Nov 2014 06:06

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Zitat:

Zitat von himitsu (Beitrag 1280415)
Jupp, es gibt keinen VCL-Thread im Delphi, oder wie kann man den dort auf die Form pappen?
TThread ist und bleibt eine Komponente der RTL.

Das ist natürlich richtig. Nur war ich der Ansicht, dass für die Leser des Tutorials der Unterschied zwischen WinAPI und VCL klarer ist als der Unterschied zwischen der WinAPI und der RTL, da die RTL nicht so direkt greif und begreifbar (im Sinne von Anfassen) ist. Deswegen habe ich mich damals für die Bezeichnung VCL-Thread entschieden.

himitsu 20. Nov 2014 07:27

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Nja, soooo einfach ist es nun wirklich nicht zu erklären.

Ist TTimer nun RTL, non-visuelle VCL oder was Anderes, wobei es ja auf CreateWindow bassiert und somit visuell ist, wenn auch unsichtbar. :stupid:
Und was ist mit TApplicationEvent, was ja ebenfalls nicht sichtbar ist, aber zum TApplication gehört, was ja eindeutig visuell ist.
Oder was ist mit der TDataSource?

Ich bin hier halt auch eher für die VCL.

Sir Rufo 20. Nov 2014 07:41

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Hier gab es doch mal (vor langer Zeit) eine ganze Reihe von Beiträgen zum Thema non-VCL.

Demnach müssen die ja gelogen haben, denn
Delphi-Quellcode:
CreateWindow
haben die auch benutzt :roll:

Daniel 20. Nov 2014 07:48

AW: VCL-Threads mit FreeOnTerminate:=true?
 
Ich denke, dass das Problem von Delphi-Laie vorläufig gelöst ist und die begriffliche Abgrenzung von VCL und RTL bei Bedarf in einem separaten Thread fortgeführt werden sollte.

himitsu 20. Nov 2014 08:11

AW: VCL-Threads mit FreeOnTerminate:=true?
 
OK, aber nur noch kurz was zu Non-VCL.

Mit Non-VCL war das direkte Benutzten der visuellen WinAPI gemeint, ohne Verwendung der Delphi-Zwischenschicht (VCL).
> CreateWindow('COMBOBOX') statt TComboBox usw.


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