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 Form wird vom Thread erstellt. Zugriff verweigert! Warum??? (https://www.delphipraxis.net/116634-form-wird-vom-thread-erstellt-zugriff-verweigert-warum.html)

romber 3. Jul 2008 12:52


Form wird vom Thread erstellt. Zugriff verweigert! Warum???
 
Eins der Formulare in meinem Programm wird nicht automatisch beim Start des Programms erzeugt, sondern wenn nötig mit

Delphi-Quellcode:
if not Assigned(frmUpdate) then
Application.CreateForm(TfrmUpdate, frmUpdate);
frmUpdate.WindowState := wsNormal;
frmUpdate.Show;
erstellt und angezeigt wird. Im OnClose-Procedure der Form habe ich

Delphi-Quellcode:
Action := caFree;
frmUpdate := nil;
Diese Form kann mann entweder per Klick auf ein Button auf der Hauptform erstellen und anzeigen oder diese wird von einem Thread automatisch erstellt und erzeugt, wenn der Thread das nötig findet. Wenn die Form durch das Klicken auf den Button erzeugt wird und dann irgendwann wieder geschlossen wird, passiert nicht. Alles in Ordnung. Wenn die Form aber durch den Thread erzeugt wird, erscheint dann beim Schließen der Form die Fehlermeldung "Code 5. Zugriff verweigert". Im Thread steht genau dieselbe Code, die im OnKlick-Procedure des Buttons steht.

Woran liegt das? Wo kommt dieses Fehler her?

Yellow579 3. Jul 2008 12:57

Re: Form wird vom Thread erstellt. Zugriff verweigert! Warum
 
Hallo romber!

VCL Oberflächenelemente dürfen niemals in einem Thread erzeugt werden sondern immer im VCL Hauptthread. Du musst somit den Constructoraufruf und weitere Zugriffe auf das Formular synchronisieren und somit mit Synchronize eine Methode deines Threads im VCL Mainthread ausführen lassen.

Gruss
Yellow

romber 3. Jul 2008 13:59

Re: Form wird vom Thread erstellt. Zugriff verweigert! Warum
 
Danke für die schnelle Antwort!

Zitat:

Zitat von Yellow579
VCL Oberflächenelemente dürfen niemals in einem Thread erzeugt werden sondern immer im VCL Hauptthread. Du musst somit den Constructoraufruf und weitere Zugriffe auf das Formular synchronisieren und somit mit Synchronize eine Methode deines Threads im VCL Mainthread ausführen lassen.

Die Code steht im Thread in einer Thread-Procedure, die mit Synchronize() im Execute aufgerufen wird. Wie soll ich es noch mehr synchronisieren?

Yellow579 3. Jul 2008 14:52

Re: Form wird vom Thread erstellt. Zugriff verweigert! Warum
 
Hallo romber!

Zitat:

Zitat von romber
Die Code steht im Thread in einer Thread-Procedure, die mit Synchronize() im Execute aufgerufen wird. Wie soll ich es noch mehr synchronisieren?

Das kam aus deinem Beitrag mir nicht so klar rüber von daher hat sich der Einwand somit erledigt.

Aber nur nochmal zur Sicherheit: Auch alle späteren Zugriffe auf das Formular von dem Thread aus, werder über einen Synchronize Aufruf synchronisiert?

Der Fehlercode 5 ist leider allzu typisch für genau solche Zugriffe, von daher nochmal diese Nachfrage.

Wenn ja, dann habe ich auf Anhieb erstmal keine weiteren Vorschläge/Ideen.

Gruss,
Yellow

romber 3. Jul 2008 15:34

Re: Form wird vom Thread erstellt. Zugriff verweigert! Warum
 
Danke Yellow!

Deine Beiträge haben mich zur Lösung des Problems gebracht!
Ich habe in der Unit der Hauptform eine Procedure erstellt, die die Code zum erzeugen und zeigen der neuen Form enthält. Im Thread synchronisiere ich dann den Aufruf dieser Prozedur. Alles klappt wunderbar! Danke!

Yellow579 3. Jul 2008 15:42

Re: Form wird vom Thread erstellt. Zugriff verweigert! Warum
 
Hallo romber!

Das ist schön zu hören. Ich habe dazu noch einen kleinen Hinweis: Wenn du für eine oder beiden Methoden keine Parameter übergeben musst vom Thread aus, dann halte im Thread einfach nur das Fensterhandle des Formulars und setze eine selbstdefinierte Nachricht mit PostMessage() ab. Du kannst zwei Integerwerte übergeben als LParam und WParam. Damit hast du keine Wartezeit im Thread durch das synchronize und synchron ist es trotzdem (Synchronize() arbeitet genauso intern).

Gruss
Yellow


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