![]() |
Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben
Hallo zusammen,
und zwar habe ich gerade ein interessantes Problem, auf welches ich absolut keine Antwort habe. Und zwar habe ich eine Controller-Klasse, in der alle Referenzen auf erzeugte Objekte gehalten werden. Beim Start meiner Anwendung erzeuge ich zunächst einen SplashScreen und einen weiteren Thread. Im SplashScreen läuft eine GIF-Animation ab und der Thread erzeugt alle nötigen Objekte -- teilweise auch VCL-Objekte, wie TListBox -- und macht sonst auch noch ein paar Sachen. Zugriff auf den Splash Screen mache ich nicht direkt aus dem Thread, sondern schicke via PostMessage immer Nachrichten, sodass der SplashScreen aktualisert wird. Beim Beenden der Anwendung will ich eine ListBox freigeben, welche in einer Methode erzeugt wurde, die vom Startup-Thread aufgerufen wurde. Nun ist es aber so, dass genau da ein Systemfehler. 1400 Ungültiges Handle erhalte und das Programm abbricht. Als ich noch nicht die Lösung mit dem Thread angestrebt hatte, lief alles problemlos. Ich verstehe nicht ganz, warum dieser Fehler auftritt? Wenn das Programm fertig geladen ist, dann hält doch nur noch nur noch der Controller alle Referenzen, der Thread ist freigegeben und ein FreeAndNil müsste doch funktionieren? Oder wird beim freigeben des Threads die ListBox auch freigegeben, da diese im Kontext des Thread erzeugt wurde? mfg *schwimm* |
Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben
As Designed. Windows GUI-Handles haben eine Thread-Affinität. Diese dürfen nur im erzeugenden Thread verwendet werden! Nicht umsonst ist die VCL nicht Thread-Save.
Alle Zugriffe (erzeugen, verwenden, freigeben) nur im Hauptthread durchführen. Ansonsten gibt es problem wenn Listbox von Thread X erzeugt wurde aber der parent vom Thread Y -> Kracht an allen möglichen stellen. |
Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben
d.h. wenn ich z.B. eine ListBox in einem Thread erzeuge, dann *ausschließlich* dort schreiben und freigeben, richtig?
Wie sieht das mit Lesen aus? PS: Muss ich auch einen synchronisierten Aufruf machen, wenn ich eine Eigenschaft einer VCL-Komponente ändere? |
Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben
Zitat:
Zitat:
|
Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben
Am besten ist Regel Nummer 1:
Sichtbare Objekte (VCL) nur im MainThread beutzen. |
Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben
Zitat:
Danke für eure Antworten schon mal :thumb: PS: Ein beliebiger Thread selbst aber schon ein VCL-Objekt erzeugen, darauf arbeiten und dann wieder zerstören, oder? Alle Aurufe bleiben eben in dem einen Thread. |
Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben
Zitat:
du weisst nicht, wie die VCL-Objekte untereinander verwoben sind - z.B. könnte deine Listbox ein Handle auf den Canvas brauchen, aber der ist in einem anderen Thread. Ich würde daher sagen, es funktioniert zumindest nicht immer, also Finger weg. Ausserdem brauchst du ja schon zum Erzeugen das Parent-Handle usw. Gruss Reinhard |
Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben
Ich habe allerdings in meiner Datenbank-Klasse eine Form, welche modal aufgerufen wird, wenn was mit der Verbindungs nicht klappt. Diese Form hat als Owner nil und braucht doch keinen Parent, oder? In diesem Fall hat jedenfalls alles geklappt.
|
Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben
Die VCL nutzt intern viele gemeinsame Resourcen ... also ist es nicht grad sicher, daß es über Threadgrenzen hinweg nie Probleme gibt.
|
Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben
Meine Erfahrung sagt, dass auch dies nicht geht.
GEnau das hatte ich auch einmal in einem Programm gemacht. Der Hauptteil besand darin, dass man nur "quasi" Unterprogramme aufruft, welche ein eigenes Fenster haben und es gibt auch sonst keine Überschneidungen. Dazu wollt ich diese Unterprogramme auch komplett in einen eigenen Thread legen. --> ging nicht und ergab plötzliche zufällige Fehler (besonders im Aussehen der Formulare) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:57 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