2011-05-07 136 views
3

我再次在一个情况下,我花了大量的时间试图定制datasnap回调样本满足我的需求。 我是老学校的OOP程序员,在我的“工具箱”PODO风格中有几个非常大的对象hierakies :-) ..有这个很棒的datasnap功能,我想利用回调的力量。德尔福datasnap回调 - 广播问题

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

尝试并创建一个简单的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的任何想法?

问候 比亚

+0

@ Bimmer_R-建议:请给我们解释一下**它是如何失败的** - 会发生什么?德尔福有什么例外?你收到什么错误信息?我不认为你会通过简单地告诉我们'它只是失败'并要求我们去建立一个datasnap服务器并找出什么会发生或没有发生什么而得到很多答案。 – Vector 2011-05-08 07:48:56

+0

@Mikey ...对不起。当然我应该提供所有需要的信息。 当我说失败 - 这意味着违反行为..或正如我指出的。 Fastmm4报告mem泄漏。创建一个datasnap服务器应用程序。你实际上需要这么几个步骤/ cliks,就像启动一个新的vcl表单应用程序一样快:-) 下面是如何设置datasnap服务器 - 并使用回调的一个很好的例子。 http://edn.embarcadero.com/article/41374 唯一的区别就像我看到的那样,Im从服务器上播放......但这真的不应该是一个问题..或者它是什么? – 2011-05-08 18:40:42

回答

0

可能的答案:你的问题是模糊的,但根据你所说的话,我会从这里开始:

德尔福XE帮助:(MS-帮助: //www.embarcadero.rs_xe/vcl/DSServer.TDSServer.BroadcastObject.html):

函数BroadcastObject(const ChannelName:String; const CallbackId:String; const Msg:TObject):boolean;超载;

第二个重载使用给定的注册回调标识符向所有客户端回调发送对象。为此,附加CallbackId参数需要在呼叫“

您使用的是第二个重载这需要3个PARAMS - ?是你的回调标识设置正确

+0

Hi Mikey。 您的正确 - 每个广播方法都有两个重载。但是当我读到“指令”时,广播不需要任何“设置”。您可以随时播放任何内容。如果没人听,那就没关系。 并与4可能的广播 - 我只能得到一个工作。 所有其他人失败访问冲突或内存泄漏。 – 2011-05-08 18:20:42

+0

@Bimmer_R:我不会调用mem leaks本身。但是AV-它们是在客户端还是服务器端生成的?您的部署如何设置?你有远程机器上的客户还是本地的一切?你能跟踪整个执行路径,直到AV?你使用的是什么版本的Delphi?你在IDE中打开了“关于Delphi语言展望”的内容吗?我相信你知道,AV经常掩盖真正的问题。如果在远程客户端上生成异常,它可能会从服务器调用中显示为AV,从而掩盖实际的客户端异常。请 - 详细信息! HTH – Vector 2011-05-08 20:03:43

+0

@Bimmer_R - 我收集,当你说'它只是失败',你的意思是有时没有什么事情发生,除非你看到泄漏报告,是正确的? “我只能得到一个工作,其他所有人都会因访问冲突或内存泄漏而失败” - 这个工作有什么不同?这可能会导致你的答案。 – Vector 2011-05-08 20:09:40

1

你给的对象那么通知或广播呼叫将由该呼叫拥有,因此不要调用“AObject.Free;”或“aJSONVal.Free;”这样做通常会导致访问冲突或其他内存管理相关问题

另请注意,广播消息会放入服务器队列中,稍后会以不同的线程发送。意思是,当您对广播的呼叫返回时,它会发送h但实际上并未将消息发送给所有客户端。

我希望帮助,

+0

Hi Mat。 感谢您对此感兴趣。我修改了CallbackChannels演示程序 - 并将其放在megaupload上(不知道如何通过SO共享文件 - 如果可能的话)。 http://www.megaupload.com/?d=BL0SZC98 记住 - 对callbackid进行回调广播...仍然不起作用。但是对频道的广播是可以的。并且callbackid/clientid的notifyobject也可以。 我希望你找到演示有用。 – 2011-05-14 07:52:24