0

DCOM テクノロジで使用するインターフェイスがあります。
インターフェイスで定義されたすべてのメソッドにはsafecallディレクティブがあります。
ただし、クライアント側では、このオブジェクトを TObject に反映させて、読み取りが必要になるたびにインターフェイスを通過しないようにしたいと考えています。

例えば

IMyInterface = interface(IDispatch);
  procedure Set_fA(const Value: WideString); safecall;
  function Get_fA: WideString; safecall;
end;

このインターフェースは によって実装されますTAutoIntfObject。この場合は、実装の keepsafecallディレクティブです。

TMyAuto = class(TAutoIntfObject, IMyInterface)
private
  fA : WideString;  
public
  procedure Set_fA(const Value: WideString); safecall;
  function Get_fA: WideString; safecall;
end;

しかし今、 TObject を使用して safecall を削除すると、次のようになります。

TMyObject = class(TObject, IMyInterface)
private
  fA : WideString;  
public
  procedure Set_fA(const Value: WideString); //??
  function Get_fA: WideString; //??
  procedure CopyFromServer(Original: OleVariant); 
end;

コンパイラは次のエラーを生成します:「Set_fA の宣言がインターフェイス IMyObject の宣言と異なります」

TObject は通常 safecall で使えるのですが、このままだと何か問題が発生するのでしょうか?
cdeclの代わりにsafecallがすべての違いを生む場合はありますか?

私がこれを行っている理由は、いくつかのTMyAutoインスタンス プロパティを読み取る必要があるたびにサーバーへの転送を避けたいからです。

4

2 に答える 2

2

データの正規値がサーバー上にあるが、値にアクセスするたびにサーバーにアクセスする必要がない場合は、ローカルにキャッシュできます。次のようになります。

TMyObject = class(TObject)
private
  fServerInterface: IMyInterface;
  fDataLoaded: boolean;

  //cached data
  fA : WideString;  
  procedure LoadAllData;
public
  procedure Set_fA(const Value: WideString);
  function Get_fA: WideString;
end;

function TMyObject.Get_fA: WideString;
begin
   if not fDataLoaded then
      LoadAllData;
   result := fA;          
end;

procedure TMyObject.Set_fA(const Value: WideString);
begin
   fServerInterface.Set_fA(value);
   fA := value;
end;

procedure TMyObject.LoadAllData;
begin
   fA := fServerInterface.Get_fA;
   fDataLoaded := true;
end;

その後、データのローカル コピーが作成され、毎回サーバーから取得する必要がなくなります。

欠点は、データがキャッシュされることです。他の人が同時にサーバーにアクセスしている場合、キャッシュは古くなる (古くなる) 可能性があり、キャッシュをメイン データ ストアと同期させておくことは、コンピューター サイエンスにおける 2 つの真に困難な問題の 1 つと呼ばれています。

キャッシュ中にデータが変更されないことが確実でない場合は、データを管理する方法が 2 つあります。まず、メイン データ ストアに加えられた変更が、キャッシュされたコピーを持っているすべてのユーザーに送信され、キャッシュを更新できるようにするシステムをセットアップします。これは非常に複雑で複雑になる可能性があり、特定のサイズと複雑さのシステムがある場合にのみ価値があります。

または、第二に、変更される可能性のあるデータをキャッシュしないでください。ビジネスを行うためのコストの一部としてオーバーヘッドを飲み込むだけです。

どのソリューションを選択するかはあなた次第です。ただし、決定する前に、物事をよく分析してください。

于 2013-07-26T20:32:10.963 に答える