3

私は再び、datasnapコールバックサンプルを自分のニーズに合わせてカスタマイズしようと猥褻な時間を費やしている状況にあります。私は古い学校のOOPプログラマーであり、「ツールボックス」PODOスタイルにいくつかの非常に大きなオブジェクト階層があります:-) ..そしてこの素晴らしいデータスナップ機能を持っているので、コールバックの力を利用したいと思います。

しかし-私がそれを実装するとき...それは単に失敗します...(FASTMM4はmemリークを報告します)。

単純なVCLデータスナップサーバー(TCP)を作成してみてください。そして、ボタンとこのソースを追加します...

procedure TForm1.Button1Click(Sender: TObject);
var
//  AObject : TObject;
  aJSONVal : TJSONValue;
begin
//  AObject := TObject.Create;
//  ServerContainer1.DSServer1.BroadcastObject('SomeChannel','SomeCallbackID', AObject);
//  AObject.Free;

  aJSONVal := TJSONObject.Create;
  ServerContainer1.DSServer1.BroadcastMessage('SomeChannel','SomeCallbackID',aJSONVal);
  // aJSONVal.Free; // Mat pointed out that this is done by the broadcast.
end;

TJSONValueを使い続ける限り、それは機能します...しかし、コメント付きのコードを切り替えてみてください。そうすれば、私が何を意味するのかがわかります。

もちろん、既存のすべてのコードをJSONに変更することもできますが、それは単に受け入れられません。

BroadcastOBJECTまたはNotifyOBJECTの使用方法について誰かが何か考えを持っていますか?

よろしくBjarne

4

2 に答える 2

2

Notify または Broadcast 呼び出しに渡したオブジェクトは、その呼び出しによって所有されます。したがって、「AObject.Free;」を呼び出さないでください。または「aJSONVal.Free;」。これを行うと、多くの場合、アクセス違反やその他のメモリ管理関連の問題が発生します。

ブロードキャストされたメッセージはサーバー上のキューに入れられ、後で別のスレッドで送信されることにも注意してください。つまり、Broadcast への呼び出しが返されたとき、実際にはまだすべてのクライアントにメッセージが送信されていません。

それが役立つことを願っています、

マット

于 2011-05-13T14:51:04.683 に答える
0

考えられる答え:あなたの質問は漠然としていましたが、あなたが言ったことに基づいて、私はここから始めます:

Delphi XE ヘルプ: (ms-help://embarcadero.rs_xe/vcl/DSServer.TDSServer.BroadcastObject.html):

function BroadcastObject(const ChannelName: String; const CallbackId: String; const Msg: TObject): boolean; 過負荷;

2 番目のオーバーロードは、特定の登録済みコールバック識別子を持つすべてのクライアント コールバックにオブジェクトを送信します。この目的のために、追加の CallbackId パラメータが呼び出しに必要です。」

3 つのパラメータを取る 2 番目のオーバーロードを使用しています - コールバック識別子は適切に設定されていますか?

于 2011-05-08T08:00:47.387 に答える