@Sir Rufo
es gibt da eine Stelle in Deinem Code, mit dem ich nicht klar komme:
Delphi-Quellcode:
constructor TWorkThread.Create( CreateSuspended : Boolean );
begin
FCS := TCriticalSection.Create;
ich war bisher davon ausgegangen dass diese Section ein eindeutiger, einmaliger Abschnitt sein muss.
Jo, aber die ist doch eindeutig für das Objekt? oder ich verstehe deine Frage nicht
Und ich verstehe auch nicht warum es einmalig sein muss?
Ich kann so viele TCriticalSection-Instanzen wie ich möchte/benötige.
Manchmal kann es Sinn machen mehrere Instanzen zu benutzen.
Es geht ja nur darum (in einer MultiThread-Umgebung) einerseits die Zugriffe auf den Speicher zu regeln (gleichzeitiges Lesen und Schreiben erzeugt halt Zugriffsfehler) und andererseits (vergleichbar mit den Transaktionen im
DB-Umfeld) konsistente Daten zu erhalten (bei geschickter Verwendung).
Kleines Beispiel zu den konsistenten Daten:
Delphi-Quellcode:
function TMyThread.GetPoint : TPoint;
begin
FCS.Enter;
try
Result := FPoint;
finally
FCS.Leave;
end;
end;
procedure TMyThread.Execute;
begin
while not Terminated do
begin
// Diese Daten sind immer konsistent bei der Abfrage
FCS.Enter;
try
FPoint.X := 1;
FPoint.Y := 1;
finally
FCS.Leave;
end;
// Hier ist die Konsistenz nicht gewährleistet - also schlechter Code :o)
FCS.Enter;
try
FPoint.X := 2;
finally
FCS.Leave;
end;
// Erfolgt jetzt ein Zugriff von aussen, dann hat FPoint ja den Wert (2,1)
FCS.Enter;
try
FPoint.Y := 2;
finally
FCS.Leave;
end;
end;
end;
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)