簡體   English   中英

在哪里可以找到TMonitor(Delphi 7),或者如何用替代功能替換它?

[英]Where can I find TMonitor (Delphi 7) or how can I replace it with an alternative function?

我有一個與Delphi RAD 10.1一起使用的代碼(Singleton-Pattern)

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,或者如何用替代功能替換它?

預先感謝您提供任何信息。

您可以從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;

如果您面臨極端的情況(性能),則可以使用關鍵部分的另一種實現,但是它們也會像讀/寫關鍵部分一樣增加使用它的復雜性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM