Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#23

AW: Ringpuffer Bibliothek veröffentlicht

  Alt 3. Jan 2022, 18:57
Ich habe das nochmal etwas verallgemeinert, da der Wrapper ja gar nichts über die zu wrappende Instanz wissen muss. Damit kann das als Wrapper für quasi jede Objekt-Instanz herhalten und man bekommt über LockInstance auch gleich den tatsachlich übergebenen Typ zurück mit allen dort verfügbaren Methoden und Eigenschaften.
Delphi-Quellcode:
type
  TThreadWrapper<T: class> = class
  private
    FLock: TObject;
    FInstance: T;
    FOwnsInstance: Boolean;
  public
    constructor Create(AInstance: T; AOwnsInstance: Boolean = True);
    destructor Destroy; override;
    function LockInstance: T;
    procedure UnlockInstance; inline;
    property OwnsInstance: Boolean read FOwnsInstance write FOwnsInstance;
  end;

...

constructor TThreadWrapper<T>.Create(AInstance: T; AOwnsInstance: Boolean = True);
begin
  inherited Create;
  FInstance := AInstance;
  FLock := TObject.Create();
  FOwnsInstance := AOwnsInstance;
end;

destructor TThreadWrapper<T>.Destroy;
begin
  LockInstance;
  try
    if OwnsInstance then
      FInstance.Free;
    FInstance := nil;
    inherited Destroy;
  finally
    UnlockInstance;
    FLock.Free;
  end;
end;

function TThreadWrapper<T>.LockInstance: T;
begin
  TMonitor.Enter(FLock);
  Result := FInstance;
end;

procedure TThreadWrapper<T>.UnlockInstance;
begin
  TMonitor.Exit(FLock);
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat