Zugriff auf Formular-Instanz aus in Instanz erstelltem Thread möglich? [gelöst]
-
Hallo,
ich habe ein Formular "Temporär" in meinem Projekt von dem erst zur Laufzeit eine Instanz "Temp" erstellt wird. Im FormShow von Temporär erstelle und starte ich einen Thread "UpdateForm", welcher auf Komponenten von Temp zugreifen muss, um diese zu aktualisieren... Wenn ich im Thread versuche auf "Temp"-Komponenten zuzugreifen (zB. Temp->Edit1->Text= "Update"; ), wird das Projekt nicht compiliert, da ja zur Entwicklungszeit die Instanz "Temp" noch nicht existiert, also dem Compiler unbekannt ist. Wie kann ich dem Compiler sagen, dass es diese Instanz später geben wird, also der Zugriff zulässig ist?
MfG
-
Erstelle eine Membervariable vom Typ deiner temorären Form in deiner Threadklasse und übergib beim Erzeugen des Threads den Zeiger auf diese Form an den Thread (z.Bsp. im Konstruktor der Threadklasse).
-
Kolumbus schrieb:
Wenn ich im Thread versuche auf "Temp"-Komponenten zuzugreifen (zB. Temp->Edit1->Text= "Update"; )
... verursachst du undefiniertes Verhalten. Visuelle VCL-Komponenten dürfen nur aus dem Haupt-Thread heraus benutzt werden; sieh dir dazu die Dokumentation von TThread::Synchronize() an.
-
BCB-Hilfe schrieb:
Die Methode Synchronize führt innerhalb des VCL-Haupt-Threads diejenige Methode aus, die mit dem Parameter Method bezeichnet ist.
typedef void __fastcall (__closure *TThreadMethod)(void);
void __fastcall Synchronize(TThreadMethod &Method);Beschreibung
Synchronize löst den Aufruf einer bestimmten Methode aus, die vom VCL-Haupt-Thread ausgeführt werden soll. Durch dieses indirekte Verfahren werden Konflikte in Multithread-Anwendungen vermieden. Wenn Sie nicht sicher sind, ob ein Methodenaufruf Thread-sicher ist, rufen Sie die Methode vom VCL-Haupt-Thread aus auf, indem Sie sie an die Methode Synchronize übergeben.
Hinweis
Der Thread wird unterbrochen, während die angegebene Methode ausgeführt wird.
Wenn ich das richtig verstehe, kann ich mir den Thread sparen, wenn ich nur visuelle Form-Komponenten aktualisieren möchte... Mit Synchronize wird der Thread eh unterbrochen und die Verarbeitung in meinen Haupt-Thread verlagert, richtig?
-
Kolumbus schrieb:
Wenn ich das richtig verstehe, kann ich mir den Thread sparen, wenn ich nur visuelle Form-Komponenten aktualisieren möchte...
Ja. Ein Thread ist eher dann sinnvoll, wenn du im Hintergrund etwas berechnen willst
Kolumbus schrieb:
Mit Synchronize wird der Thread eh unterbrochen und die Verarbeitung in meinen Haupt-Thread verlagert, richtig?
Für die Dauer des Aufrufes der Synchronize()-Methode, ja.
In C++Builder 2009 gibt es außerdem noch TThread::Queue(), das die Threadausführung nicht unterbricht, sondern die übergebene Methode einfach bei nächster Gelegenheit im UI-Thread ausführt.
-
Guten Morgen,
Danke noch für die Antworten
MfG