AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben
Thema durchsuchen
Ansicht
Themen-Optionen

Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben

Ein Thema von s.h.a.r.k · begonnen am 23. Dez 2009 · letzter Beitrag vom 24. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben

  Alt 23. Dez 2009, 14:19
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*
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben

  Alt 23. Dez 2009, 14:29
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben

  Alt 23. Dez 2009, 14:31
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?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben

  Alt 23. Dez 2009, 14:33
Zitat von s.h.a.r.k:
d.h. wenn ich z.B. eine ListBox in einem Thread erzeuge, dann *ausschließlich* dort schreiben und freigeben, richtig?
Ja
Zitat von s.h.a.r.k:
Wie sieht das mit Lesen aus?
Genauso. Es wird ja auch hier bei diversen Property-Abfragen das Windows-Handle benötigt.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben

  Alt 23. Dez 2009, 14:34
Am besten ist Regel Nummer 1:
Sichtbare Objekte (VCL) nur im MainThread beutzen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#6

Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben

  Alt 23. Dez 2009, 14:43
Zitat von s.h.a.r.k:
PS: Muss ich auch einen synchronisierten Aufruf machen, wenn ich eine Eigenschaft einer VCL-Komponente ändere?
Hatte noch eine Änderung an meinem obigen Post gemacht Wohl etwas zu spät, wie ich gesehen hatte. Aber ich gehe einfach mal davon aus, dass die Änderungen auch synchronisiert erfolgen müssen.

Danke für eure Antworten schon mal

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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#7

Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben

  Alt 23. Dez 2009, 16:21
Zitat von s.h.a.r.k:
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.
Hallo,

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
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben

  Alt 23. Dez 2009, 16:28
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben

  Alt 23. Dez 2009, 16:36
Die VCL nutzt intern viele gemeinsame Resourcen ... also ist es nicht grad sicher, daß es über Threadgrenzen hinweg nie Probleme gibt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Von ThreadA erzeugtes VCL-Objekte von ThreadB freigeben

  Alt 23. Dez 2009, 16:38
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)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:40 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