AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Erstellung und Freigabe von Formularen in einem Thread
Thema durchsuchen
Ansicht
Themen-Optionen

Erstellung und Freigabe von Formularen in einem Thread

Ein Thema von Alex_ITA01 · begonnen am 3. Nov 2014 · letzter Beitrag vom 3. Nov 2014
Antwort Antwort
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#1

Erstellung und Freigabe von Formularen in einem Thread

  Alt 3. Nov 2014, 10:51
Hallo zusammen,
ich habe folgendes Problem:

Ein von mir erstellter Thread, initialisiert im Create vom Thread eine Instanz auf ein Objekt (=class).
Dieses Objekt hat im Create wiederrum ein Formular, welches erstellt wird mit AOwner = Nil.
Wenn der Thread beendet wird (=Destroy), wird die Instanz auf das Objekt auch freigegeben. Dieses hat wiederrum im Destroy die Freigabe des Formulars stehen, da es ja mit AOwner=Nil erzeugt wurde.

Der Thread hat FreeOnTerminate = False

Wenn ich oben besagtes durchlaufe, bekomme ich bei der Freigabe des Formulars die Exception: Systemfehler 5:Zugriff verweigert.
Habt ihr eine Idee, woran das liegen kann? Wenn ich das Formular mit AOwner=Application erstelle und es nicht selber freigebe, dann bekomme ich keine Exception.
Im OnDestroy des Formulars steht übrigens kein Quelltext, da auch im OnCreate nichts extra initialisiert wird.

Viele Grüße
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Erstellung und Freigabe von Formularen in einem Thread

  Alt 3. Nov 2014, 11:01
Sorge einfach dafür, dass die Erzeugung und Freigabe im Kontext vom MainThread erfolgt.

Grundsätzlich ist es natürlich generell fraglich, wofür das insgesamt gut sein soll. Wenn ich etwas anzeigen möchte, dann erzeuge ich eine Form und sage der zeig mir das da mal an.

Sieht mir eher nach einer Vermischung von Logik und Anzeige aus.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#3

AW: Erstellung und Freigabe von Formularen in einem Thread

  Alt 3. Nov 2014, 11:12
Naja, es ist eine Form, die zu dem Thread "gehört" und auch nur dann erzeugt werden soll, wenn es den Thread gibt bzw. dieser erstellt wurde. Er soll sozusagen der "Owner" für das Form sein und hat auch seine entsprechenden Semaphoren und VCL Zugriffe auf die Form...
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Erstellung und Freigabe von Formularen in einem Thread

  Alt 3. Nov 2014, 11:19
Da die VCL nicht threadsicher ist sollten alle Formulare im Hauptthread erzeugt, manipuliert und freigegeben werden!
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#5

AW: Erstellung und Freigabe von Formularen in einem Thread

  Alt 3. Nov 2014, 11:41
Da die VCL nicht threadsicher ist sollten alle Formulare im Hauptthread erzeugt, manipuliert und freigegeben werden!
Es werden globale Objekte (Font, Brush, Pen uws.) als Vorlagen verwendet und außerdem registrieren sich die VCL-Forms/Komponenten in globalen Listen.

Man kann Formulare in Threads erzeugen, aber dafür braucht man dann im Thread eine Messagebehandlung und kann die VCL nicht benutzen. (maximal vielleicht eine eigständige VCL, z.B. in einer DLL, wobei die DLL dann auch im Thread geladen/freigegeben werden müsste)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: Erstellung und Freigabe von Formularen in einem Thread

  Alt 3. Nov 2014, 12:18
Naja, es ist eine Form, die zu dem Thread "gehört" und auch nur dann erzeugt werden soll, wenn es den Thread gibt bzw. dieser erstellt wurde. Er soll sozusagen der "Owner" für das Form sein und hat auch seine entsprechenden Semaphoren und VCL Zugriffe auf die Form...
Form = GUI
Thread = Logik

Da man das -siehe Sir Rufo- nicht mischen soll, liegt hier ein Designproblem vor. Aber es ist schon klar, was Du bezwecken willst.

Führe dazu eine Klasse ein, die sowohl den Thread startet als auch das Formular sichtbar macht. Nennen wir die mal 'ThreadController'. Der Thread teilt dem ThreadController mit,
  • wenn er gestartet wird => Form sichtbar machen
  • wenn er beendet wird => Form unsichtbar machen
  • wenn es etwas darzustellen gibt => Darstellen
Der Thread kann das über Synchronize-Aufrufe so steuern, das sich alles schön im Kontext des Mainthreads ausgeführt wird. Wenn der Thread das dann auch noch über Events löst, hast Du Form und Thread komplett entkoppelt, d.h. der Thread kennt die Form nicht, meldet aber per Event Änderungen an seinem inneren Zustand. Und der ThreadController sorgt dafür, das diese Änderungen in der Form landen.

Der Thread kann bzw. sollte nach außen hin komplett unsichtbar sein, d.h. Alles läuft über den ThreadController.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#7

AW: Erstellung und Freigabe von Formularen in einem Thread

  Alt 3. Nov 2014, 12:25
Naja, es ist eine Form, die zu dem Thread "gehört" und auch nur dann erzeugt werden soll, wenn es den Thread gibt bzw. dieser erstellt wurde.
Form = GUI
Thread = Logik
Logisch ja, aber praktisch nein.

Ein "Window" (Form/Komponenten), welches per CreateWindow erstellt wird, wird mit dem Thread verbunden, in welchem es erstellt wurde.
Messages landen dann in diesem Thread und werden über dessen Nachrichtenbehandlung verarbeitet.

Darum landen bei der VCL auch PostMesssage, SendMessage und sonstige Events immer im Hauptthread.

Auf Seiten der Messages ist die VCL also threadsave, genauso, als wenn man es manuell über Synchronize machen würde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 3. Nov 2014 um 12:28 Uhr)
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#8

AW: Erstellung und Freigabe von Formularen in einem Thread

  Alt 3. Nov 2014, 12:36
Ok danke erstmal.
Die Aufrufe zum Form erfolgen auch komplett über Synchronize oder Events. Also entkoppelt ist es sowieso. Wollte aber das Form nicht immer erzeugen wollen im Hauptfenster, da ich den Thread evtl. bei dem einen Projekt benutze (also Form wird gebraucht) und in einem Projekt den Thread nicht drinne habe (Form wird also nicht gebraucht). Deswegen wollte ich dem Thread das Formular erzeugen und freigeben lassen, weil dieser ja weiß, wann werde ich benötigt und wann nicht.

Hat es denn irgendwelche Nachteile, wenn ich als AOwner=Application angebe und die manuelle Freigabe des Formulars bei mir rausnehme?

Viele Grüße
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: Erstellung und Freigabe von Formularen in einem Thread

  Alt 3. Nov 2014, 13:01
Es ist grundsätzlich nicht zu empfehlen das TForm der VCL in einem Thread zu nutzen, auch wenn es in dessen Kontext geschieht. Die VCL betreibt einfach zu viel non-thread-safe Gelumpe im Hintergrund. Du könntest aber durchaus mit der nackten WinAPI Fenster in einem Thread erzeugen, müsstest dann aber halt auch alles zu Fuß erledigen. Inklusive Nachrichtenschleife usw.
Was du da jetzt machst, ist eine ziemliche Verrenkung zwischen Haupt-(VCL-)Thread und einem anderen. Das wird vermutlich immer irgendwo knallen. Ich würde da eher dem Hauptthread signalisieren ein entsprechendes Fenster bei Bedarf zu erzeugen, und auch Werte die aus dem Thread stammen mittels Messages über den Hauptthread dort anzeigen - nicht mit dieser Synchronize-Krücke.
Ich würde deinen bisherigen Ansatz nicht weiter versuchen hinzufuckeln, das ist imho verschwendete Zeit.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Erstellung und Freigabe von Formularen in einem Thread

  Alt 3. Nov 2014, 13:09
Form = GUI
Thread = Logik
Logisch ja, aber praktisch nein.
Praktisch auch JA. Denn es geht nicht um irgendeinen Thread, sondern um den ganz konkreten Thread des TE. Und der hat nun gar nichts mit der VCL am Hut. Sollte er mindestens.

Nur weil zufällig die VCL in einem Thread läuft, weil ja alles in einem Thread läuft, sollte man die Grundaussage der Trennung noch nicht mal im Ansatz in Frage stellen ('praktisch: Nein'). Das verwirrt doch nur unnötig.
  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 04:38 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