{*
  멀티 스레드에서 사용 되는 변수가 있을 경우 사용하기 위해서 임계영역과 세트로
  작성돤 데이터 래핑 클래스이다.  단 번에 참조하지 않고 참조되는 동안 프로세스가
  진행되는 경우, 멀티 스레드 상에서 경합을 피하기 위해서 사용한다.
}
unit SyncValues;

interface

uses
  Classes, SysUtils, SyncObjs;

type
  TSyncValue = class
  private
    FCS : TCriticalSection;
  public
    constructor Create;
    destructor Destroy; override;

    procedure Lock;
    procedure Unlock;
  end;

  TSyncInteger = class (TSyncValue)
  private
    FValue: integer;
  public
    property Value : integer read FValue write FValue;
  end;

  TSyncString = class (TSyncValue)
  private
    FValue: string;
  public
    property Value : string read FValue write FValue;
  end;

  TSyncShortString = class (TSyncValue)
  private
    FValue: ShortString;
  public
    property Value : ShortString read FValue write FValue;
  end;

  TSyncBoolean = class (TSyncValue)
  private
    FValue: boolean;
  public
    property Value : boolean read FValue write FValue;
  end;

  TSyncSize = class (TSyncValue)
  private
    FX: integer;
    FY: integer;
  public
    procedure SetValue(AX,AY:integer);

    property X : integer read FX write FX;
    property Y : integer read FY write FY;
  end;

implementation

{ TSyncValue }

constructor TSyncValue.Create;
begin
  inherited;

  FCS := TCriticalSection.Create;
end;

destructor TSyncValue.Destroy;
begin
  FCS.Free;

  inherited;
end;

procedure TSyncValue.Lock;
begin
  FCS.Enter;
end;

procedure TSyncValue.Unlock;
begin
  FCS.Leave;
end;

{ TSyncSize }

procedure TSyncSize.SetValue(AX, AY: integer);
begin
  Lock;
  try
    FX := AX;
    FY := AY;
  finally
    Unlock;
  end;
end;

end.
