Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Properties, ihre Getter und Setter und Thread-Safety

  Alt 15. Mär 2013, 14:05
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. Delphi-Referenz durchsuchenTValue oder Delphi-Referenz durchsuchenVariant 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)

Geändert von Sir Rufo (15. Mär 2013 um 14:23 Uhr)
  Mit Zitat antworten Zitat