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 =)