Also für Faule gibt es z.B. folgende Lösung
Delphi-Quellcode:
unit CSLazy;
interface
uses
SyncObjs;
type
ICS =
interface
['
{C1D6A40D-14CA-4E33-8FF7-CD0A01385343}']
procedure Enter;
function TryEnter : Boolean;
procedure Leave;
end;
function CS( ACS : TCriticalSection ) : ICS;
implementation
type
TCS =
class( TInterfacedObject, ICS )
private
FCS : TCriticalSection;
FEntered : Boolean;
protected
procedure Enter;
function TryEnter : Boolean;
procedure Leave;
public
constructor Create( ACS : TCriticalSection );
destructor Destroy;
override;
end;
function CS( ACS : TCriticalSection ) : ICS;
begin
if Assigned( ACS )
then
Result := TCS.Create( ACS )
else
Result :=
nil;
end;
{ TCS }
constructor TCS.Create( ACS : TCriticalSection );
begin
inherited Create;
FCS := ACS;
end;
destructor TCS.Destroy;
begin
if FEntered
then
FCS.Leave;
inherited;
end;
procedure TCS.Enter;
begin
FCS.Enter;
FEntered := True;
end;
procedure TCS.Leave;
begin
FCS.Leave;
FEntered := False;
end;
function TCS.TryEnter : Boolean;
begin
Result := FCS.TryEnter;
FEntered := Result;
end;
end.
Benutzung:
Delphi-Quellcode:
type
TMyThread = class( TThread )
private
FCS : TCriticalSection;
FValue : string;
function GetValue : string;
procedure SetValue( const Value : string );
public
property Value : string read GetValue write SetValue;
end;
function TMyThread.GetValue : string;
begin
CS( FCS ).Enter;
Result := FValue;
end;
procedure TMyThread.SetValue( const Value : string );
begin
CS( FCS ).Enter;
FValue := Value;
end;
UPDATE
Du könntest auch über indizierte Properties gehen, dann hast du nur einen Getter/Setter für alle (gut der Typ muss gleich sein, wobei ja auch z.B.
TValue oder
Variant als Typ möglich wären).
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)