![]() |
Problem mit dynamisch erzeugten Komponenten
Hallo,
habe folgendes Problem : ich habe eine Anwendung geschrieben, wo mehrere Threads beinhaltet. Innerhalb dieser Threads wird dynamisch eine Komponente erzeugt, welche aus verschieden visuellen Komponenten besteht. Wenn der Thread seine Aufgabe erfüllt hat wird/soll diese Komponente wieder verschwinden ! Ohne dies Komponente geht alles wunderbar die Threads machen ihre Aufgabe usw. Baue ich die Komponente mit ein hängt das Programm (alles steht wahrsch. Deadlook) . Mein Frage : Weiß jemand ob Probleme mit dynamisch erzeugten Komponenten bekannt sind oder auf was ich achten sollte ? Gibt es Nachteile usw.....? Vielen dank schon im voraus ! |
Re: Problem mit dynamisch erzeugten Komponenten
Wenn du über getrennte Threads auf die visuelle Controls zugreifst, musst du die Aufrufe synchronisieren. Dafür rufts du innerhalb deines Threads die Methode Synchronize auf, welche als Parameter eine Prozedur braucht. Innerhalb dieser Prozedur kannst du dann auf die VCL zugreifen... Benutze mal die Suche dazu hier im Forum.
![]() |
Re: Problem mit dynamisch erzeugten Komponenten
Visuelle Komponenten und Threads ist nicht bzw. nur sehr eingeschränkt.
Die IDE hat dir bei erzeugen einer Unit für eine Thread-Objekt auch eine fetten Hinweis darauf gegeben: Zitat:
|
Re: Problem mit dynamisch erzeugten Komponenten
Naja Bernard, so eingeschränkt ist es ja dann doch nicht. Mittels Synchronize funktioniert es ja, und solange die einzelnen Threads nicht permanent an der GUI rumfuschen, kann man damit ja auch ganz gut leben.
|
Re: Problem mit dynamisch erzeugten Komponenten
Was meinste damit ?
Unsere Thread hat die Aufgabe eine Datei einzulesen und dabei auf unserem Formular ständig die Anzeige zu aktualisieren . Bsp. Bearbeite 1000 von 5000 was wäre hier die beste Lösung ? |
Re: Problem mit dynamisch erzeugten Komponenten
Afaik müssen die Komponenten an sich auch ausserhalb des Threads erzeugt werden, sonst ist die Fensterzuordnung und die SubElemente/Objekte dem Thread zu geordnet und dann bekommt die VCL wiederrum Probleme (da sie z.B. Handles intern selbst verwaltet). Von daher das Element an sich auch über Synchronize im Hauptthread anlegen und auch freigeben.
/EDIT: Dann wäre es doch am besten wenn der Thread einfach nur einen CallBack bietet welchen er synchronisiert aufruft und dabei den aktuellen Fortschritt mit einem Ordinaltyp übergibt. Alternativ auch per PostMessage direkt aus dem Thread dem Hauptfenster senden, dann dort die Nachricht verarbeiten und entsprechend den Fortschritt anzeigen. Mit letzter Möglichkeit entfällt die Synchronisierung, da es die Messageverwaltung schon macht und der Thread wird nicht für die Aktualisierung der Oberfläche angehalten/gestört. |
Re: Problem mit dynamisch erzeugten Komponenten
Ich würde es auch so machen, dass der Thread die Hauptanwendung benachrichtigt (per Message, Pipe, Socket oder sonst was). Die Hauptanwendung aktualisiert dann die Fortschrittsanzeige.
Threads mit VCL ist IMMER kritisch. Entweder benutzt man Synchronize (dann steht der Thread aber solange, bis die Procedure fertig abgearbeitet ist) oder es knallt an allen Ecken und Enden. Spätestens, wenn man eine Mehrprozessor-Architektur hat, knallt es. |
Re: Problem mit dynamisch erzeugten Komponenten
Vielen dank jetzt geht es habe die Komponente einfach mittels Synchronize erzeugt !
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 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