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;