![]() |
VCL Zugriffe in Multithread Anwendung absichern
Hallo,
Ich möchte gerne VCL Zugriffe in einer Multithread Anwendung im Nachhinein absichern. Konkret hatten wir bereits öfter das Problem "Leinwand erlaubt kein Zeichnen", das war in der Regel auf nicht threadsichere Laufbalken zurrückzuführen...diese haben wir gegen threadsichere Laufbalken ausgetauscht, seit dem haben wir das Problem "Leinwand Erlaubt kein Zeichnen" nur noch höchst selten... Nun ist es mir heute beim laden der DFM Ressource eine Formulars wieder passiert... ...kann ich sowas absichern in dem ich eine Critical Section drumherum mache? ...gibt es nicht noch etwas weniger brutales? Mir geht es um Formulare die unsichtbar bleiben und nur wegen irgendwelcher Funktionen der Formulare erzeugt werden. Man muss/soll sie gar nicht sehen , von daher ist "Leinwand erlaubt kein Zeichnen" besonders ärgerlich. Was würdet ihr mir raten? Daten und View trennen ist eher ein Langzeitziel, weil es etliche Formulare sind die so verwendet werden. |
Re: VCL Zugriffe in Multithread Anwendung absichern
Auch wenns mühsam ist, wirst Du Dich da wohl durchbeissen müssen. Ich habe immer wieder Projekte ähnlicher "Güte", z.B. 500K Zeilen Code und alles wie Kraut und Rüben durcheinander. Da hilft nur entweder neu schreiben oder modular auslagern (Wenn ständig eine Produktivversion verfügbar sein muss, wird letzteres vermutlich vorzuziehen sein)
|
Re: VCL Zugriffe in Multithread Anwendung absichern
Also wenn du die VCL Thread-Klasse verwendest, dann solltest du die Threads mit der Methode Synchronize mit dem Hauptthread synchronisieren.
|
Re: VCL Zugriffe in Multithread Anwendung absichern
Also , ich erzeuge in dem Thread ein Formular, das eigentlich bereits geblockt ist, d.h. für die zeit pausieren
eh alle anderen Threads in einer While schleife. Und es wäre Sinnvoll vor dem erzeugen des Formulars Syncronize anzuwenden? Aus dem Hauptthread heraus? Ich lese es mir mal durch. |
Re: VCL Zugriffe in Multithread Anwendung absichern
Hallo QuickAndDirty,
Ich denke mal, dass du in Deinen Threads Methoden der unsichtbaren Formulare direkt aufrufst. Diese sorgen sowohl für die Datenverarbeitung als auch für die grafische Darstellung. Ich denke, dass du wie du richtig schreibst die Trennung von GUI und Daten brauchst. Aber auch die Daten müssen eigentlich geschützt werden vor multiblen Zugriffen. ThreadA schreib währen ThreadB liest. Diese Gleichzeitigkeit kommt ja auch noch hinzu. "Leinwand erlaubt kein Zeichnen" kenne ich z.B. auch im Zusammenhang mit ActiveControl. Eine Komponente die Disabled ist und dann ActiveControl werden soll. Meist ist dann die Logig für aktivieren und deaktivieren der Komponenten in den OnShow-Ereignissen der Formulare die ja aber eben nie ausgelöst werden :-( Naja, ich denke du verstehst was ich meine. Ich denke meine Vorredner haben bereits schon das wichtigste gesagt: Syncronize bei den VCL-Threads und die Trennung GUI/Daten muss her :-) Viel Erfolg. Chris [EDIT]Roter Kasten: Die Methoden die du aufrufst kannst du mit Sycronize aufrufen wenn die fragliche Methode keine Parameter hat -> Syncronize(MeineMethode)[/EDIT] |
Re: VCL Zugriffe in Multithread Anwendung absichern
Hi QuickAndDirty,
Zitat:
Ich mache es so, daß ich hierfür Methoden mit Parameterübergabe entwerfe und der Thread nur die neuen Informationen übergibt (ja nach Methode synchronisiert oder über Klassen mit Getter/Setter und CriticalSections oder MRSW). Die GUI Aktualisierung erfolgt dann hauptsächlich automatisch z.B. über ActionListen-Updates. Aber grob gesagt muß alles aus der VCL von Threads aus synchronisiert werden. Dafür ist es unerheblich, ob andere Threads "in while Schleifen" stecken und nichts machen. Es ist ja trotzdem nicht der Mainthread der da auf die VCL zugreift. Gruß Assertor |
Re: VCL Zugriffe in Multithread Anwendung absichern
Ja, also wir locken Multiplen Zugriff eigentlich bereits manuell über eine Queue.
Dann hängen in dem Moment mehrere Threads und warten auf einen...dies betrifft nur die sensitiven Funktionen (es handelt sich um eine Datenbank Anwendung). So können die Anderen zugriffe an den Wartenden threads vorbei parallel verarbeitet werden. Das trennen von 700k+ Zeilen Code wird jetzt nicht mal eben so zu bewerkstelligen sein, und diese Fehler treten ca. alle 2 Monate 1 mal auf. Dann aber oft mehrmals an einem Tag. Und der Letzte Fehler geschah im debuggen beim setzen von SetTextheight eines Labels während der Dialog geladen wurde... Ich versuche also erstmal Synchronize, wir arbeiten sowieso daran schritt für Schritt MVC-Trennung zu erreichen. |
Re: VCL Zugriffe in Multithread Anwendung absichern
Hi,
Zitat:
Im Idealfall kann man dann z.B. sogar bei einem eventuellen Programmiersprachenwechsel für andere Betriebssysteme die Funktionen schnell nachbilden und muß "nur" eine weitere GUI entwerfen. Gruß Assertor |
Re: VCL Zugriffe in Multithread Anwendung absichern
ja in der Theorie...in der Praxis hängt dann vieles an den Borland/Inpries/Codegear/libraries....und etlichen
dritten QR-Soft, TMS, IP, Eleveatsoft...... |
Re: VCL Zugriffe in Multithread Anwendung absichern
Sorry wegen des doppel Posts...
Arrg hat sich erledigt, Onexecute im TService Objekt ist der richtig Ort für das CheckSynchronize, scheint zumindest zu funktionieren. // habe ich schon raubekommen // Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:53 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