Einzelnen Beitrag anzeigen

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, 17: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