2017-02-14 17 views
0

У меня есть код (Singleton- шаблон), который работает с Delphi RAD 10,1Где я могу найти TMonitor (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; 

мне нужно сейчас тот же самый код в Delphi 7. Но компилятор сказал, «TMonitor не известно».

Где я могу найти TMonitor или как заменить его альтернативной функцией?

Я благодарю вас за любую информацию.

+4

Используйте TCriticalSection вместо ... – whosrdaddy

+2

Я, я бы использовал критический раздел для этого, даже если бы монитор был доступен. –

+2

Или «фиксированный» 'TCriticalSection', [Fixing TCriticalSection] (https://www.delphitools.info/2011/11/30/fixing-tcriticalsection/). –

ответ

2

Вы можете использовать TCriticalSection из модуля SyncObjs. Подход немного меняется. Критический раздел должен использоваться как объект. Так что если вы хотите, чтобы защитить область от вас объект на может сделать что-то вроде:

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; 

Если вы столкнулись с очень экстремальный сценарий (производительность), вы можете работать еще виды реализации критических секций, но они также будут увеличить сложность работы с ним, как критический раздел чтения/записи.