3

我又遇到了一种情况,我花了很多时间来尝试根据我的需要自定义 datasnap 回调示例。我是老派 OOP 程序员,在我的“工具箱”PODO 样式中有几个非常大的对象层次结构 :-) .. 拥有这个出色的数据快照功能,我想利用回调的力量。

但是 - 当我实现它时......它只是失败了......(FASTMM4报告内存泄漏)。

尝试创建一个简单的 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; 超载;

第二个重载将一个对象发送到具有给定注册回调标识符的所有客户端回调。为此,调用中需要一个额外的 CallbackId 参数。”

您正在使用需要 3 个参数的第二个重载 - 您的回调标识符是否设置正确?

于 2011-05-08T08:00:47.387 回答