За пример беру: TThreadList
- Код: Выделить всё
Type
{ TData }
TData = Class
fData: Integer;
FLock: TRTLCriticalSection;
private
function GetData: Integer;
procedure SetData(AValue: Integer);
public
Procedure Lock;
Procedure UnLock;
Constructor Create;
Destructor Destroy; override;
Property Data: Integer read GetData write SetData;
end;
implementation
{ TData }
function TData.GetData: Integer;
begin
Lock;
try
Result := fData;
finally
UnLock;
end;
end;
procedure TData.SetData(AValue: Integer);
begin
Lock;
try
fData := AValue;
finally
UnLock;
end;
end;
procedure TData.Lock;
begin
System.EnterCriticalSection(FLock);
end;
procedure TData.UnLock;
begin
System.LeaveCriticalSection(FLock);
end;
constructor TData.Create;
begin
InitCriticalSection(FLock);
end;
destructor TData.Destroy;
begin
inherited Destroy;
DoneCriticalSection(FLock);
end;
В потоке вызываю так:
- Код: Выделить всё
TInt:= TestD1.Data;
inc(TInt);
TestD1.Data:=TInt;
При этом после вычислений значение TestD1.Data отклоняется от ожидаемой величины.
Но если вызывать в потоке вот так:
- Код: Выделить всё
TestD1.Lock;
try
TInt:= TestD1.Data;
inc(TInt);
TestD1.Data:=TInt;
finally
TestD1.UnLock;
end;
То все работает как нужно.
Что делаю не так?