2017-02-14 5 views
0

私はデルファイRAD私は今のDelphi 7で同じコードを必要とする10.1TMonitor(Delphi 7)はどこにありますか、それを代替機能で置き換えるにはどうしたらいいですか?

type 

    TSharedData = class 
    private 
    FPOL: integer; 
    class var FUniqueInstance: TSharedData; 
    procedure SetFPol(const Value: integer); 
    constructor Create; 
    public 
    class function GetInstance: TSharedData; 
    property POL: integer read FPOL write SetFPol; 
    end; 

var 
    Key: TObject; 

implementation 

{ TSharedData } 

constructor TSharedData.Create; 
begin 
    SetFPol(1); 
end; 

class function TSharedData.GetInstance: TSharedData; 
begin 
    TMonitor.Enter(Key); // <-- error here 
    try 
    if FUniqueInstance = nil then 
    begin 
     FUniqueInstance := TSharedData.Create; 
    end; 
    finally 
    TMonitor.Exit(Key); 
    end; 
    Result := FUniqueInstance; 
end; 

procedure TSharedData.SetFPol(const Value: integer); 
begin 
    FPOL := Value; 
end; 

initialization 
    Key:= TObject.Create; 
finalization 
    Key.Free; 

で動作するコード(Singleton-パターン)を持っていますが、コンパイラは、「TMonitorが知られていない」と述べました。

どこでTMonitorを見つけることができますか、または代替機能でどのように置き換えることができますか?

事前にお読みいただきありがとうございます。

+4

代わりにTCriticalSectionを使用してください... – whosrdaddy

+2

私は、モニタが利用可能であっても、このためにクリティカルセクションを使用します。 –

+2

または「固定」TCriticalSection、[Fixing TCriticalSection](https://www.delphitools.info/2011/11/30/fixing-tcriticalsection/)。 –

答えて

2

SyncObjsユニットからTCriticalSectionを使用できます。 アプローチは少し変わります。クリティカルセクションはオブジェクトとして使用する必要があります。あなたは非常に極端なシナリオ(パフォーマンスを)直面している場合は、クリティカルセクションの実装の別の種類を働かせることができるが、それらはまた、意志

type 
    TSafeCounter = class(TObject) 
    private 
    FValue: Integer; 
    FCriticalSection: TCriticalSection; 
    public 
    constructor Create; 
    destructor Destroy; override; 

    procedure SafeInc; 
    procedure SafeDec; 

    function CurValue: Integer; 
    end; 

implementation 

{ TSafeCounter } 

constructor TSafeCounter.Create; 
begin 
    FCriticalSection := TCriticalSection.Create; 
end; 

function TSafeCounter.CurValue: Integer; 
begin 
    FCriticalSection.Acquire; 
    try 
    Result := FValue; 
    finally 
    FCriticalSection.Release; 
    end; 
end; 

procedure TSafeCounter.SafeDec; 
begin 
    FCriticalSection.Acquire; 
    try 
    Dec(FValue); 
    finally 
    FCriticalSection.Release; 
    end; 
end; 

destructor TSafeCounter.Destroy; 
begin 
    FCriticalSection.Free; 

    inherited; 
end; 

procedure TSafeCounter.SafeInc; 
begin 
    FCriticalSection.Acquire; 
    try 
    Inc(FValue); 
    finally 
    FCriticalSection.Release; 
    end; 
end; 

:あなたがあなたの地域を保護したいのであれば同じような何かを行うことができます上のオブジェクトクリティカルセクションの読み取り/書き込みのような作業の複雑さを増やします。

関連する問題