AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Weitere Synchronisierungsmöglichkeiten ?
Thema durchsuchen
Ansicht
Themen-Optionen

Weitere Synchronisierungsmöglichkeiten ?

Ein Thema von geskill · begonnen am 13. Mai 2011 · letzter Beitrag vom 14. Aug 2011
Antwort Antwort
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#1

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 13. Mai 2011, 22:03
Mit Messages würde es bestimmt gehen, aber dann müsste ich ja ziemlich viel ändern (überall einen Message-Listener). Und dass dann Kreuz und Quer Windows Nachrichten hin und her geschickt werden gefällt mir auch nicht. Zumal auch mehrere Instanzen von einer Komponente existieren können. Wenn man dann an diese eine Nachricht schickt, wird die andere die dann doch auch bekommen?

Es muss doch eine einfache Möglichkeit geben, wie man sich mit dem Hauptthread synchronisieren kann
Sebastian
  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
 
#2

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 13. Mai 2011, 22:08
Ist die DLL in Delphi geschrieben?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 13. Mai 2011, 22:17
Ja, aber genau das möchte ich auch offen lassen. Deshalb würde ich gerne wie oben im Ausschnitt angedeutet an dieser Stelle Synchronisationspunkte einfügen. Sprich ich müsste am Code der DLL nichts ändern.
Sebastian
  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
 
#4

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 13. Mai 2011, 23:22
Mir würden dies bzgl. zwei Möglichkeiten einfallen:
  • Alle Properties, die via DLL abgefragt werden können sollen, sollten via CriticalSection/TMonitor oder sonst was abgesichert werden. Dann spielt es keine Rolle mehr, welcher Thread darauf zugreift. Dies kann aber seeeehr komplex werden.
  • Eine weitere Idee wäre es, eine Schnittstelle zu schaffen, mit der ein DLL-Thread kommunizieren kann. Diese Schnittstelle synchronisert dann jeden Aufruf mit dem Mainthread. Vorteil hiervon wäre, dass du die Technik "hinter" der Schnittstelle auch noch austauschen könntest, ohne, dass du die DLLs ändern müsstest.
Vielleicht wäre es für alle anderen noch interessant, wie viele Daten denn für die DLLs zur Verfügung stehen müssen. Sind es wirklich beliebig viele Daten, dann ist so eine Schnittstelle evtl. auch sehr komplex...
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 14. Mai 2011, 00:58
Ich habe mir jetzt gerade mal ein kleines Testprogramm geschrieben, dass permanent mit 2 Threads auf ein Memo schreibt. Zusätzlich habe ich auch noch versucht Werte in das Memo einzugeben (also manuell). Das ganze habe ich jeweils mit einer TCriticalSection, TMonitor und TMultiReadExclusiveWriteSynchronizer probiert und bei allen drei Klassen kam es nie zu irgendwelchen Fehlern - sprich jeder Zugriff wurde anscheinend sauber synchronisiert.

Eigentlich genau das was ich will, nur habe ich nicht gedacht, dass es so funktioniert. Ich dachte jetzt für die richtige VCL-Synchronisation (also mit dem Hauptthread) wäre noch mehr notwendig.
Angehängte Dateien
Dateityp: zip TMonitor.zip (1,14 MB, 3x aufgerufen)
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 14. Mai 2011, 03:24
Warum sollte mehr notwendig sein?

Allerdings ist eine CriticalSection auch ein sehr harter Eingriff der alle beteiligten Threads ausbremsen kann bis zum Deadlock.
Ähnlich verhält es sich mit Delphi-Referenz durchsuchenSynchronize.

Ein fast ungebremstes Verhalten bekommt man mit Delphi-Referenz durchsuchenQueue, da hier ein Thread etwas in die Warteschlange des Hauptthreads schickt und nicht auf die Fertigstellung wartet.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 12. Aug 2011, 14:47
Allerdings ist eine CriticalSection auch ein sehr harter Eingriff der alle beteiligten Threads ausbremsen kann bis zum Deadlock.
Entstehen diese Deadlocks durch Fehler vom Programmierer oder durch die Komponente selber?

Weil ich habe das Demo Programm gerade etwas geändert, sodass 2 Threads in ein Memo schreiben (dauerhaft). Nebenbei klicke ich auf einen Button der mehrere Male etwas in das Memo schreibt. Wenn man das Programm nun etwas länger laufen lässt und ausgiebig auf den Button klickt wird es früher oder später zu einem Deadlock kommen.

Im Debugger unter Thread Status steht dann z.b. sowas:
Code:
Projekt1.exe
 - 5516 | Ausführbar
 -  996 | Ausführbar
 - 4700 | Ausführbar |   |   | Blockiert beim Aufruf von SendMessage an ein Fenster im Besitz von Thread 5516
Mir ist schon klar, wenn ich einen Thread schlafen lege, welcher gerade innerhalb des Locks ist, dass es so zu einem Deadlock kommt.
Könnte es sein, dass es unter extremen Bedingungen (wildes Kicken auf einen Button) dazu kommt, dass es der Komponente zuviel wird und sie dann selber Aussetzer macht?

Beim googeln bin ich auch gerade auf folgenden Artikel gestoßen:
http://dn.embarcadero.com/article/28258
Dort steht im Code ein Kommentar von wegen:
Zitat:
//Still important to synchronize VCL calls
Deshalb war ich auch verwirrt und dachte, wie im Beispiel ist ein Synchronize-Befehl wichtig.

EDIT:
Der Button auf dem Formular benutzt ja auch den Lock, obwohl es an dieser Stelle unnötig ist, da man ja schon im Hauptthread befindet. Ja das sollte das Problem sein
Sebastian

Geändert von geskill (12. Aug 2011 um 15:00 Uhr)
  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 12:49 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