AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit dynamisch erzeugten Komponenten

Ein Thema von pronny31 · begonnen am 5. Mär 2008 · letzter Beitrag vom 5. Mär 2008
Antwort Antwort
pronny31

Registriert seit: 8. Okt 2007
97 Beiträge
 
#1

Problem mit dynamisch erzeugten Komponenten

  Alt 5. Mär 2008, 11:24
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 !
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Problem mit dynamisch erzeugten Komponenten

  Alt 5. Mär 2008, 11:29
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Problem mit dynamisch erzeugten Komponenten

  Alt 5. Mär 2008, 11:29
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; }
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Problem mit dynamisch erzeugten Komponenten

  Alt 5. Mär 2008, 11:56
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.
  Mit Zitat antworten Zitat
pronny31

Registriert seit: 8. Okt 2007
97 Beiträge
 
#5

Re: Problem mit dynamisch erzeugten Komponenten

  Alt 5. Mär 2008, 12:05
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 ?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Problem mit dynamisch erzeugten Komponenten

  Alt 5. Mär 2008, 12:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Problem mit dynamisch erzeugten Komponenten

  Alt 5. Mär 2008, 12:22
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.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
pronny31

Registriert seit: 8. Okt 2007
97 Beiträge
 
#8

Re: Problem mit dynamisch erzeugten Komponenten

  Alt 5. Mär 2008, 13:49
Vielen dank jetzt geht es habe die Komponente einfach mittels Synchronize erzeugt !
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:02 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