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 Problem mit dynamisch erzeugten Komponenten (https://www.delphipraxis.net/109653-problem-mit-dynamisch-erzeugten-komponenten.html)

pronny31 5. Mär 2008 12:24


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 !

Jelly 5. Mär 2008 12:29

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.Hier im Forum suchenSynchronize

Bernhard Geyer 5. Mär 2008 12:29

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:

{ Wichtig: Methoden und Eigenschaften von Objekten in VCL oder CLX können
nur in Methoden verwendet werden, die Synchronize aufrufen, z.B.:

Synchronize(UpdateCaption);

wobei UpdateCaption so aussehen könnte:

procedure sfsdf.UpdateCaption;
begin
Form1.Caption := 'In einem Thread aktualisiert';
end; }

Jelly 5. Mär 2008 12:56

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.

pronny31 5. Mär 2008 13:05

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 ?

Muetze1 5. Mär 2008 13:05

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.

RavenIV 5. Mär 2008 13:22

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.

pronny31 5. Mär 2008 14:49

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 12:55 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