За пример беру: 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;
То все работает как нужно.
Что делаю не так?



