2011-05-07 131 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