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
Seite 1 von 2  1 2      
Benutzerbild von geskill
geskill

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

Weitere Synchronisierungsmöglichkeiten ?

  Alt 13. Mai 2011, 18:53
Delphi-Version: 2010
Hallo,
in meinem aktuellen Projekt benutze ich Threads die ich nicht synchronisiert habe bzw. mir das richtige Werkzeug dafür fehlt. Normalerweise ruft man in der TThread-Klasse ganz normal die Synchronize-Methode auf. Jetzt lade ich in der Execute-Methode aber eine DLL, welche ein Interface bekommt, was auch auf VCL-Elemente zugreifen kann. Dieses Interface können mehrere DLLs (jeweils in eigenem Thread) bekommen und auch der Benutzer selber kann auf diese VCL-Elemente z.b. ein Eingabefeld zugreifen.

In der DLL steht mir nun aber keine Synchronize-Methode zur Verfügung. Eigentlich will ich das auch nicht (innerhalb der DLL), vielmehr sollen die entsprechenden kritischen Funktionen im Interface synchronisiert werden (also was dahinter liegt).

Hier mal ein Beispiel wie es momentan ist:
Delphi-Quellcode:
  IBasic = interface
    // weitere Funktionen
    function GetValue: WideString;
    procedure SetValue(aValue: WideString);

// ...

function TIRichEdit.GetValue;
begin
  // der nächste Schritt soll nun Synchronisiert ablaufen
  result := FMycxRichEdit.Lines.Text;
end;

procedure TIRichEdit.SetValue(AValue: WideString);
begin
  // hier auch Synchronisieren
  FMycxRichEdit.Lines.Text := AValue;
end;
In Java was ich gerade an der UNI lerne kann man eine komplette Methode einfach so synchronisieren (egal ob man sich nun im Thread befindet oder nicht):
Code:
public synchronized void SetValue(string AValue) {
        FMycxRichEdit.Lines.Text = AValue;
    }
Im Forum habe ich hier immer mal wieder was von den kritischen Abschnitten gelesen, jedoch kam es so mir so vor, als würde das nur funktionieren werden wenn 2 verschiedene Threads (nicht Hauptthread) auf 1 Objekt zugreifen wollen, was aber überhaupt nichts mit der VCL zutun hat:
Delphi-Quellcode:
//Die Variable genau für 1 VCL Objekt
var CriticalSection: TCriticalSection;

// ...

procedure TIRichEdit.SetValue(AValue: WideString);
begin
  CriticalSection.Enter;
  try
    FMycxRichEdit.Lines.Text := AValue;
  finally
    CriticalSection.Leave;
  end;
end;
In dem Tutorial von Michael Puff über Threads bin ich über die Funktion "InterlockedExchangeAdd" gestolpert, dies wäre ja in der Tat das richtige für mich nur das gibt es ja leider nur für Variablen.

Ich würde mich freuen, wenn der ein oder andere mir dazu ein paar Tipps geben könnte =)
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, 19:37
Zitat:
In der DLL steht mir nun aber keine Synchronize-Methode zur Verfügung. Eigentlich will ich das auch nicht (innerhalb der DLL), vielmehr sollen die entsprechenden kritischen Funktionen im Interface synchronisiert werden (also was dahinter liegt).
Warum eigentlich nicht? -> TThread.Synchronize() ist doch eine Klassenmethode und hängt somit nicht an einem Objekt.
»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, 20:40
Weil ich überhaupt keinen Zugriff mehr auf das Thread-Objekt habe. Das gebe ich der DLL ja nicht mit.

Also nochmal kurz eine Übersicht wie das Programm funktioniert:

Auf dem Hauptprogramm sind diverse VCL Komponenten (Eingabefelder, DropDownfelder ...) diese sind alle in Klassen gekapselt. Die Klassen implementieren ein Interface (IBasic). Der Programmbenutzer kann diese Eingabefelder alle bearbeiten.

Es können aber auch mehrere Threads gestartet werden, welche in der Execute-Methode eine DLL Laden und eine Funktion aufrufen. Dabei wird der Funktion in der DLL das Interface mit übergeben, worüber ich in der DLL dann z.b. Werte aus den Eingabefeldern lesen aber auch Werte schreiben kann. D.h. alles was in der DLL geschieht, ist in einem eigenen Thread.

Problematisch wird es, wenn die Funktion in der DLL nun einen Wert von einem Eingabefeld lesen will, der Benutzer dies aber gerade ändert.
Sebastian
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#4

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 13. Mai 2011, 20:43
Probiers doch mal mit Messages... PostMessage ...
Das Bild hängt schief.
  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 13. Mai 2011, 23: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
 
#6

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 13. Mai 2011, 23: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
 
#7

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 13. Mai 2011, 23: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
 
#8

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 14. Mai 2011, 00: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
 
#9

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 14. Mai 2011, 01: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
 
#10

AW: Weitere Synchronisierungsmöglichkeiten ?

  Alt 14. Mai 2011, 04: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
Antwort Antwort
Seite 1 von 2  1 2      


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:42 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