我又一次处于这样的境地,我花了大量的时间来尝试根据我的需求定制datasnap回调示例。我是一个老派的OOP程序员,在我的“工具箱”PODO风格中有几个非常大的对象层次结构:-) ..有了这个很棒的datasnap特性,我想利用回调的力量。
但是-当我实现它的时候...它只是失败了..。(FASTMM4报告内存泄漏)。
尝试创建一个简单的VCL datasnap服务器- 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吗?
问候比亚尼
发布于 2011-05-08 16:00:47
可能的答案:你的问题很模糊,但根据你所说的,我会从这里开始:
Delphi XE帮助:(ms-help://embarcadero.rs_xe/vcl/DSServer.TDSServer.BroadcastObject.html):
函数BroadcastObject(const ChannelName: String;const CallbackId: String;const Msg: TObject):boolean;overload;
第二个重载使用给定的已注册回调标识符向所有客户端回调发送对象。为此,调用中需要一个额外的CallbackId参数。“
您正在使用第二个重载,它需要3个参数-您的回调标识符设置正确吗?
发布于 2011-05-13 22:51:05
然后,您提供给通知或广播调用的对象将归该调用所有。因此,不要调用"AObject.Free;“或"aJSONVal.Free;”。这样做通常会导致访问冲突或其他与内存管理相关的问题。
另请注意,广播的消息被放入服务器上的队列中,然后在不同的线程中发送。这意味着,当您的广播调用返回时,它实际上还没有将消息发送到所有客户端。
我希望这能帮上忙
垫子
https://stackoverflow.com/questions/5924396
复制相似问题