I have created this \"threadsafe\" generic property, that i can use between the main thread and a background Thread. I made it because i was tired of creating Lock-Objects f
Your code is fine and will serialize read/write access to the property. The only comment that I would make is that you do not need to create a separate lock object. You can remove PropLock
and lock on Self
instead.
I have an almost identical class in my code base. The only differences are:
TMonitor
because I still don't trust TMonitor
. The early versions had a number of bugs and that dented my confidence. However, I suspect that the TMonitor
code is most likely correct by now. So I see no reason for you to change.FWIW, my version of your class looks like this:
type
TThreadsafe<T> = class
private
FLock: TCriticalSection;
FValue: T;
function GetValue: T;
procedure SetValue(const NewValue: T);
public
constructor Create;
destructor Destroy; override;
property Value: T read GetValue write SetValue;
end;
{ TThreadsafe<T> }
constructor TThreadsafe<T>.Create;
begin
inherited;
FLock := TCriticalSection.Create;
end;
destructor TThreadsafe<T>.Destroy;
begin
FLock.Free;
inherited;
end;
function TThreadsafe<T>.GetValue: T;
begin
FLock.Acquire;
Try
Result := FValue;
Finally
FLock.Release;
End;
end;
procedure TThreadsafe<T>.SetValue(const NewValue: T);
begin
FLock.Acquire;
Try
FValue := NewValue;
Finally
FLock.Release;
End;
end;
I guess there's really just one way to write this class!