乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      斗膽開(kāi)個(gè)Datasnap交流貼

       quasiceo 2017-02-10
      標(biāo)題:
      斗膽開(kāi)個(gè)Datasnap交流貼 瀏覽:2561
      加入我的收藏
      樓主: 首先聲明,開(kāi)此貼僅并不是想說(shuō)明Datasnap的好與不好,也不包含其它任何比較之意,僅是靠個(gè)人對(duì)Delphi的喜愛(ài)而開(kāi)此貼。

      限于各種原因,本人并沒(méi)有什么Datasnap的實(shí)際經(jīng)驗(yàn),只是業(yè)余時(shí)間喜歡“把玩”--寫(xiě)些小DEMO測(cè)試,所以很抱歉,無(wú)法提供Datasnap的一些性能測(cè)試的數(shù)據(jù),僅能提供少許寫(xiě)DEMO時(shí)的體會(huì),即希望能拋磚引玉,也希望對(duì)剛接觸Datasnap的新人有所幫助。若有不正確之處,歡迎指出。

      如果“臟”了誰(shuí)的眼,勿噴,請(qǐng)繞行。
      ----------------------------------------------
      學(xué)無(wú)止境

      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-13 12:21:52
      1樓: 鄙人將整理一些之前的DEMO,找時(shí)間上來(lái)補(bǔ)充----雖然有些可能在網(wǎng)上能搜到。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 kingofsun (小矮人酋長(zhǎng)) ▲▲▲▲▲ -
      普通會(huì)員
      2015-1-13 12:30:28
      2樓: 呵呵頂一個(gè),
      ----------------------------------------------
      -
      作者:
      男 topok (topok) ▲▲▲▲▲ -
      盒子活躍會(huì)員
      2015-1-13 12:51:04
      3樓: http://blog.csdn.net/shuaihj/article/details/6129131
      ----------------------------------------------
      -
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-13 13:23:12
      4樓: 在寫(xiě)代碼之前,首先要考慮使用的協(xié)議類(lèi)型, 是tcp/ip還是http(s),不同的協(xié)議對(duì)應(yīng)不同的設(shè)計(jì),tcp/ip是長(zhǎng)連,服務(wù)器端可以知道當(dāng)前有多少在線用戶(hù),http可以方便的改為IIS方式,不同的協(xié)議類(lèi)型,Server Class LifeCycle(Server Class是指TDSServerClass)可以有不同的選擇,不同的選擇對(duì)應(yīng)不同的設(shè)計(jì),
      Server Class LifeCycle對(duì)于Datasnap的性能是非常重要的,分為
      Server, Session, Invocation三種,每種類(lèi)型的特點(diǎn),網(wǎng)上可搜到相關(guān)文章或李維先生的電子書(shū)。

      對(duì)于服務(wù)程序的性能,除硬件外就是靠軟件方面的優(yōu)化了,Datasnap內(nèi)部使用的是indy組件,是阻塞的,每次響應(yīng)都依賴(lài)一個(gè)線程,datasnap本身提供了“池”的功能。所以服務(wù)方法要盡快的完成,好讓線程回到池中再利用。在并發(fā)和負(fù)載較大的程序中是很重要的。所以不管是tcp或http,盡量分批取少量的數(shù)據(jù),如果的確要取大量的數(shù)據(jù),不如直接開(kāi)個(gè)dbxcallback(回調(diào))更好,還可以在客戶(hù)端顯示進(jìn)度。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      女 judger (ERP) ▲▲▲▲▲ -
      盒子活躍會(huì)員
      2015-1-13 13:29:43
      5樓: 為了回復(fù)你,我登錄了一下系統(tǒng),支持?。?!
      ----------------------------------------------
      -
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-13 13:39:15
      5樓: 除了分批次,少量取數(shù)據(jù)提高性能外,服務(wù)方法中參數(shù)的數(shù)據(jù)類(lèi)型也會(huì)對(duì)性能有影響,Datasnap是基于DBX framework的,在delphi幫助提到
      Currently, using a TDBXValue is the fastest way to pass a parameter, because these are the internal objects used to manage parameter lists.
      如果參數(shù)是一般的string等簡(jiǎn)單類(lèi)型,基本可以忽略,但如果參數(shù)是TStream類(lèi)型時(shí),可以用TDBXStreamValue來(lái)替換,記得在XE2時(shí)候測(cè)試過(guò),比一般TStream類(lèi)型節(jié)約30%的返回時(shí)間。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 smartdata (smartdata) ▲▲▲▲▲ -
      普通會(huì)員
      2015-1-13 13:40:50
      4樓: 好帖,頂樓主!
      ----------------------------------------------
      ==========
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-13 13:56:59
      6樓: 感謝judger (ERP)的支持.

      繼續(xù)
      function CreateDBXStreamValue: TDBXStreamValue;
      var
        VT: TDBXValueType;
      begin
        VT := TDBXValueType.Create(nil);
        VT.DataType := TDBXDataTypes.BlobType;
        VT.ValueTypeFlags := TDBXValueTypeFlags.ExtendedType;
        Result := TDBXStreamValue.Create(VT);
      end;
      創(chuàng)建一個(gè)TDBXStreamValue可用上面的代碼,
        VT.ValueTypeFlags := TDBXValueTypeFlags.ExtendedType;這行代碼在XE2中,好像是需要的,在XE?好像不再需要了(或許也需要)記不清了(當(dāng)時(shí)是寫(xiě)DEMO跟蹤發(fā)現(xiàn)的,心血?。?。
            procedure SetStream(const Stream: TStream; const AInstanceOwner: Boolean); override;
            function  GetStream(AInstanceOwner: Boolean): TStream; override;
      這兩個(gè)方法對(duì)應(yīng)服務(wù)端和客戶(hù)端的取值,其中的AInstanceOwner參數(shù)比較重要,可能會(huì)造成內(nèi)存泄漏或報(bào)異常,客戶(hù)端需要和下面TServerMethodsClient的Create方法搭配使用。
          TServerMethodsClient.Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload;
      實(shí)際上,TServerMethodsClient.Create中的AInstanceOwner是比較重要的,在傳一些對(duì)象參數(shù)時(shí),需要注意。后面我會(huì)寫(xiě)一些經(jīng)驗(yàn),但還是要靠個(gè)人摸索掌握。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 looper (keyo) ★☆☆☆☆ -
      盒子活躍會(huì)員
      2015-1-13 14:06:36
      7樓: 難得有這種好帖子。支持一下。
      ----------------------------------------------
      雖千萬(wàn)人吾往矣!
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-13 14:20:32
      7樓: 除了參數(shù)類(lèi)型外,通過(guò)Server Class LifeCycle的Server, Session, Invocation三種類(lèi)型,還可以"榨出"Datasnap一些性能來(lái),這個(gè)技巧應(yīng)該在XE or XE2時(shí)就有了,當(dāng)時(shí)EMB在土豆,奇藝上發(fā)過(guò)一些視頻,基中就有介紹,目前在EMB的網(wǎng)站上也還有。具體的代碼就不上了,主要是說(shuō)說(shuō)原理。
      當(dāng)使用tcp協(xié)議時(shí),TDSServerClass的LifeCycle可以設(shè)置為Server,Session, Invocation的一種,http時(shí),delphi的文檔上說(shuō):
      For a REST client connection, if Session LifeCycle is used on the server class, it behaves like Invocation LifeCycle. 
      所以利用Invocation類(lèi)型,我們可以緩存TDSServerClass實(shí)例。具體辦法是
      在TDSServerClass的OnCreateInstance和OnDestroyInstance事件中池化TDSServerClass的實(shí)例,這和網(wǎng)上寫(xiě)的監(jiān)控客戶(hù)端連接是一個(gè)意思。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-13 14:46:47
      8樓: 除此之外,涉及到數(shù)據(jù)庫(kù)的,自覺(jué)使用連接池(自己實(shí)現(xiàn)也好,用fdac的也好)
      一般的數(shù)據(jù)查詢(xún),使用DBX framework時(shí),返回DBXReader最好了。(目前未與直接返回TDataset對(duì)比過(guò),感覺(jué)dataset最終也會(huì)轉(zhuǎn)為dbxreader)

      慎用TDSClientCallbackChannelManager的注冊(cè)回調(diào),除非只是為了接收其它客戶(hù)端或服務(wù)器端的消息。 如果有SQLConnection產(chǎn)生一個(gè)連接了, 不要用TDSClientCallbackChannelManager的BroadcastToChannel或NotifyCallback方法,而要通過(guò)SQLConnection調(diào)用服務(wù)器的一個(gè)方法進(jìn)行廣播或通知其它客戶(hù)端----原因后續(xù)再說(shuō)明。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 zhuzh_yuy (華) ▲▲▲▲▲ -
      普通會(huì)員
      2015-1-13 18:14:46
      9樓: 好貼,嚴(yán)重支持
      ----------------------------------------------
      -
      作者:
      男 yemny (yemny) ▲▲▲▲▲ -
      盒子活躍會(huì)員
      2015-1-13 18:59:59
      10樓: 鼓掌 頂 支持 威武
      比口水 睡好 睡不好 個(gè)人感覺(jué) 好 5倍
      ----------------------------------------------
      -
      作者:
      男 yagzh (心不了情) ▲▲▲▲▲ -
      盒子活躍會(huì)員
      2015-1-13 19:26:58
      11樓: 頂一下
      ----------------------------------------------
      -
      作者:
      男 wangdejun (wangdejun) ▲▲▲▲▲ -
      普通會(huì)員
      2015-1-14 8:00:03
      12樓: 對(duì)初學(xué)者有意義的,支持
      ----------------------------------------------
      -
      作者:
      男 shloverxp (shloverxp) ▲▲▲▲▲ -
      盒子活躍會(huì)員
      2015-1-14 9:41:17
      13樓: 將帖子標(biāo)注為好帖,將LZ標(biāo)注為高手
      ----------------------------------------------
      -
      作者:
      男 fky1989 (fky1989) ▲▲▲△△ -
      注冊(cè)會(huì)員
      2015-1-14 9:44:10
      14樓: 好貼 支持lZ
      ----------------------------------------------
      -
      作者:
      男 looper (keyo) ★☆☆☆☆ -
      盒子活躍會(huì)員
      2015-1-15 14:08:36
      15樓: 頂。
      ----------------------------------------------
      雖千萬(wàn)人吾往矣!
      作者:
      男 pengmg (Challey) ▲▲▲▲▲ -
      普通會(huì)員
      2015-1-15 19:23:37
      16樓: 是的,請(qǐng)有過(guò)實(shí)際案例的把情況發(fā)上來(lái),討論討論
      ----------------------------------------------
      -
      作者:
      男 hzforce ( ) ▲▲▲▲▲ -
      普通會(huì)員
      2015-1-18 10:37:52
      17樓: 好貼! 另外請(qǐng)教一個(gè)問(wèn)題:

      datasnap服務(wù)器上的方法,如果用http方式請(qǐng)求的話,他會(huì)返回 
      {"result":[{"name":"123","dfd":1}]}
      這種格式,能有辦法讓他直接返回
      {"name":"123","dfd":1}
      這樣的格式嗎?
      ----------------------------------------------
      -
      作者:
      男 bigboy2050 (bigboy2050) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-18 11:09:15
      18樓: 好?。?!
      ----------------------------------------------
      -
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-18 14:19:16
      19樓: to: hzforce ( )

      //----------

      procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject;
        var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean);
      begin
        Form1.Memo1.Lines.Add(command.Text);
        Form1.Memo1.Lines.Add(ResultVal.ToString);
        if Command.Text='TServerMethods1.ReverseString' then
          Handled := True
        else
          Handled := False;
      end;

      //----------
      IE:
      http://localhost:8080/datasnap/rest/TServerMethods1/ReverseString/abc

      //----------
      測(cè)試結(jié)果:  

      ["cba"]
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 dawnhawk (dawnhawk) ▲▲▲▲▲ -
      盒子活躍會(huì)員
      2015-1-18 15:36:55
      20樓: 每天來(lái)看看樓主有沒(méi)有更新,謝謝!
      ----------------------------------------------
      -
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-18 19:59:58
      21樓: 謝謝dawnhawk (dawnhawk)和其它朋友的關(guān)注,這幾天有點(diǎn)事情耽擱了。
      總體來(lái)說(shuō),datasnap用起來(lái)是比較簡(jiǎn)單的,從精靈向?qū)梢约跋嚓P(guān)的組件屬性,事件,方法上也可以看出來(lái),所以使用中可控的東西不是很多----從XE5之后,datasnap基本上沒(méi)有什么變化。

      下面繼續(xù)寫(xiě)下之前說(shuō)的TDSClientCallbackChannelManager注冊(cè)回調(diào)。

      用TDSClientCallbackChannelManager注冊(cè)一個(gè)回調(diào)后,會(huì)產(chǎn)生一個(gè)新的連接,如果再調(diào)用TDSClientCallbackChannelManager.NotifyXXXX 或 BroadcastXXXX的時(shí)候,還會(huì)新建一個(gè)連接,然后再斷開(kāi),并且TDSClientCallbackChannelManager在取消注冊(cè)的回調(diào)時(shí),會(huì)產(chǎn)生連接,斷開(kāi),連接,斷開(kāi)至少兩次。所以頻繁的用TDSClientCallbackChannelManager發(fā)送消息,會(huì)頻繁的產(chǎn)生連接,斷開(kāi),對(duì)服務(wù)程序會(huì)有一定的影響。

      所以使用TDSClientCallbackChannelManager的時(shí)機(jī),應(yīng)該是“只為了被動(dòng)的接收其它客戶(hù)端或服務(wù)端的消息通知”,這種方式實(shí)際上屬于“服務(wù)端推送”的方式。當(dāng)程中已經(jīng)有一個(gè)用SQLConnection建立的連接時(shí),更不要用TDSClientCallbackChannelManager去發(fā)送信息,最好服務(wù)器程序中提供類(lèi)似這樣的方式:
          function NotifyCallback(const AChannelName, AClientId, AValue: string): Boolean;
      begin
        Result := FDSServer.BroadcastMessage(AChannelName, AClientId,
          TJSonString.Create(AValue));
      end
      用SQLConnection的現(xiàn)有連接去執(zhí)行消息的廣播,這樣就減少了服務(wù)程序的連接,斷開(kāi)次數(shù)。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 hzforce ( ) ▲▲▲▲▲ -
      普通會(huì)員
      2015-1-22 14:56:47
      22樓: 感謝樓主的指教.
      現(xiàn)在又有一個(gè)新的問(wèn)題

      我現(xiàn)在想使用https協(xié)議,我的做法是增加了一個(gè)TDSCertFiles控件,然后設(shè)置好TDSHTTPService的CertFile屬性,然后下載了一個(gè)最新openssl,把需要的那兩個(gè)dll文件放在程序的目錄底下,然后我用https://localhost:8081/datasnap/rest/TServerMethods1/ReverseString/abc提交的時(shí)候就出現(xiàn)問(wèn)題了,提示如下:
      First chance exception at $7544B760. Exception class EIdOSSLUnderlyingCryptoError with message
      'Error accepting connection with SSL.
      error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher'.
      Process Project1.exe (4656)

      First chance exception at $7544B760. Exception class EIdOSSLUnderlyingCryptoError with message
      'Error accepting connection with SSL.
      error:1408A10B:SSL routines:SSL3_GET_CLIENT_HELLO:wrong version number'.
      Process Server_Controller.exe (1224)

      我已經(jīng)換過(guò)好幾個(gè)openssl的版本了,還是不行,請(qǐng)問(wèn)這個(gè)會(huì)是什么原因呢?
      我的系統(tǒng)是 win7 32位 + XE7 update1
      ----------------------------------------------
      -
      作者:
      男 hzforce ( ) ▲▲▲▲▲ -
      普通會(huì)員
      2015-1-22 16:01:14
      23樓: 唉,原來(lái)證書(shū)問(wèn)題~~~
      ----------------------------------------------
      -
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-26 16:32:52
      24樓: 今天又發(fā)現(xiàn)個(gè)問(wèn)題,TCP連接方式,TDSClientCallbackChannelManager注冊(cè)回調(diào)后,心跳功能不起作用,只有服務(wù)端執(zhí)行回調(diào)時(shí),才會(huì)觸發(fā)異常。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-29 0:16:30
      25樓: TDSClientCallbackChannelManager注冊(cè)回調(diào)后,服務(wù)端的連接線程會(huì)被”掛起“
      相當(dāng)于WaitForSingleObject的INFINITE死等,如果網(wǎng)路異常斷開(kāi),會(huì)一直掛著,除非網(wǎng)絡(luò)連通后,客戶(hù)端重新注冊(cè)回調(diào)。

      所以最好周期性用DSServer.notifyxxxx
      去發(fā)送一個(gè)TJSONNull的消息,用來(lái)“激活”線程,線程激活后會(huì)產(chǎn)生正常的Disconnect事件。否則掛”死“的線程會(huì)起來(lái)越多,服務(wù)程序早晚會(huì)掛了。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 topok (topok) ▲▲▲▲▲ -
      盒子活躍會(huì)員
      2015-1-29 9:22:54
      26樓: delphi哪個(gè)版本的Datasnap穩(wěn)定高效,網(wǎng)上有人說(shuō)XE3的非常不穩(wěn)定而且還特別慢
      ----------------------------------------------
      -
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-31 0:54:12
      27樓: 發(fā)現(xiàn)XE7的一個(gè)BUG。

      unit Unit1;

      interface

      uses
        Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
        Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IPPeerClient, Datasnap.DSCommon,
        Vcl.StdCtrls, Data.DBXJSON, System.JSON;

      type
        TForm1 = class(TForm)
          Button1: TButton;
          Button2: TButton;
          DSCCM: TDSClientCallbackChannelManager;
          procedure Button1Click(Sender: TObject);
          procedure Button2Click(Sender: TObject);
          procedure FormCreate(Sender: TObject);
        private
        public
          { Public declarations }
        end;

        TCB = class(TDBXCallback)
        public
          function Execute(const Arg: TJSONValue): TJSONValue; overload; override;
        end;

      var
        Form1: TForm1;

        Flag: Boolean;

      implementation

      {$R *.dfm}

      { TCB }

      function TCB.Execute(const Arg: TJSONValue): TJSONValue;
      begin
        Result := TJSONTrue.Create;
      end;

      procedure TForm1.Button1Click(Sender: TObject);
      begin
        Flag := DSCCM.RegisterCallback('A', TCB.Create);
      end;

      procedure TForm1.Button2Click(Sender: TObject);
      begin
        if Flag then
          DSCCM.UnregisterCallback('A');
      end;

      procedure TForm1.FormCreate(Sender: TObject);
      begin
        ReportMemoryLeaksOnShutdown := True;
      end;

      end.

      注冊(cè)回調(diào)后,再反注冊(cè),再注冊(cè),再反注冊(cè)。就會(huì)有內(nèi)存泄漏了。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 wiseinfo (wisienfo) ▲▲▲▲▲ -
      普通會(huì)員
      2015-1-31 0:59:06
      27樓: TO:jjwwang

      繼續(xù)普及下周期性用DSServer.notifyxxxx 線程激活后會(huì)產(chǎn)生正常的Disconnect事件
      ----------------------------------------------
      -
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-31 1:01:24
      28樓: function TDSClientCallbackChannelManager.RegisterCallback(
        const CallbackId, ChannelNames: string; const Callback: TDBXCallback): Boolean;
      var
        Status: Boolean;
        Item, LItem: TDSCallbackItem;
      begin
        TMonitor.Enter(FLocalCallbackRepo);
        try
          if not FLocalCallbackRepo.ContainsKey(CallbackId) then
          begin
            Item := TDSCallbackItem.Create(FChannelName, Callback, ChannelNames);
            FLocalCallbackRepo.Add(CallbackId, Item);

            if FLocalCallbackRepo.Count = 1 then
            begin
              FState := ctsStarted;
              FStateError := EmptyStr;

              // start a thread if this is the first registered callback (check if there an active one)
      {**********}
              FDSChannelThread := TDSChannelThread.Create(
      每注冊(cè)一次回調(diào)就創(chuàng)建一個(gè)線程。
      {**********}
                procedure
                begin
                try
                ExecuteRemote('DSAdmin', 'ConnectClientChannel',
                procedure (Params: TDBXParameterList)
                begin
                Params[0].Value.AsString := FChannelName;
                Params[1].Value.AsString := FManagerId;


      但是:


      constructor TDSClientCallbackChannelManager.TDSChannelThread.Create(
        Worker: TDSWorker; Manager: TDSClientCallbackChannelManager);
      begin
        FWorker := Worker;
        FManager := Manager;
      {**********}
        FreeOnTerminate := False;  
      這里不是自動(dòng)釋放線程資源
      {**********}
        inherited Create(False); // Suspended
      end;


      并且:

      destructor TDSClientCallbackChannelManager.Destroy;
      begin
        try
          // unregister all outstanding callbacks
          CloseClientChannel();
        except
          // igonore I/O errors at this point
        end;
      {**********}
      TDSClientCallbackChannelManager釋放的時(shí)候,F(xiàn)DSChannelThread 只釋放一次。
      {**********888}
        if FDSChannelThread <> nil then
        begin
          FDSChannelThread.WaitFor;
          FDSChannelThread.Free;
        end;
      {**********8}

      所以多次注冊(cè),多次創(chuàng)建了線程,但只有一個(gè)能釋放。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-31 1:04:08
      29樓: 建議:

      動(dòng)態(tài)創(chuàng)建TDSClientCallbackChannelManager進(jìn)行回調(diào)注冊(cè),取消回調(diào)或注冊(cè)回調(diào)失敗后,立即釋放TDSClientCallbackChannelManager。 再注冊(cè)的時(shí),重復(fù)上面的過(guò)程。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-31 1:20:02
      30樓: to: wiseinfo (wisienfo)

      只是粗略的跟蹤了一下D的代碼,大體感覺(jué)是這樣子。
      實(shí)際上,只要服務(wù)程序通知回調(diào)的時(shí)間周期不是很長(zhǎng)的話,應(yīng)該也沒(méi)有什么問(wèn)題。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-31 22:14:03
      31樓: 閑暇之余又看了看TDSClientCallbackChannelManager的代碼,越想越覺(jué)得起火,感覺(jué)就是臨時(shí)對(duì)付著寫(xiě)的,EMB的工程師根本沒(méi)用心。

      主要問(wèn)題:

      1 RegisterCallback反回值并不能代碼注冊(cè)回調(diào)成功與否。由于在TDSChannelThread線程中向服務(wù)程序注冊(cè)TDBXCallback, 所以RegisterCallback方法的返回值是在線程執(zhí)行完之前返回的,并不能表時(shí)TDSChannelThread注冊(cè)回調(diào)成功了。

      2 TDSChannelThread線程中產(chǎn)生異常時(shí),觸發(fā)TDSClientChannelManagerEvent事件,所以開(kāi)發(fā)者在TDSClientChannelManagerEvent事件中寫(xiě)的代碼,即可能是在主線程中,也可能是在TDSChannelThread線程。不注意時(shí),可能給開(kāi)發(fā)者帶來(lái)麻煩。

      3 注銷(xiāo)回調(diào)的UnregisterCallback方法,要與服務(wù)程序 【連接,斷開(kāi)】 2次。 難道就不能用一個(gè)連接去讓服務(wù)程序做事嗎?

      4 TDSChannelCallback, TDSChannelThread, TDSChannelInvokeEvent都是內(nèi)部的。 想借用點(diǎn)源代都不容易。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 jjwwang (jjwwang) ▲▲▲▲▲ -
      注冊(cè)會(huì)員
      2015-1-31 22:30:53
      32樓: 替代方法:

      1 用SQLConnection連接Datasnap服務(wù)。
      2 創(chuàng)建DBXCommand,然后按照TDSClientCallbackChannelManager下面的代碼片段的方式,自己寫(xiě)代碼注冊(cè)回調(diào),
                ExecuteRemote('DSAdmin', 'ConnectClientChannel',
                procedure (Params: TDBXParameterList)
                begin
                Params[0].Value.AsString := FChannelName;
                Params[1].Value.AsString := FManagerId;
                Params[2].Value.AsString := CallbackId;
                Params[3].Value.AsString := ChannelNames;
                Params[4].Value.AsString := FSecurityToken;
                Params[5].Value.SetCallbackValue(FChannelCallback);
                end,
      補(bǔ)充說(shuō)明:
      如果Datasnap的服務(wù)程序上的ChannelName中已經(jīng)存在ClientID客戶(hù)端標(biāo)識(shí)的話,注冊(cè)是不會(huì)成功的,所以 [不是] 首次注冊(cè)回調(diào)時(shí),要先從服務(wù)端清除掉之前的ChannelName中的ClientID.具體方法,參照TDSClientCallbackChannelManager中注銷(xiāo)回調(diào)的源代碼。

      這樣一來(lái),可以避免多次和服務(wù)程序的 連接,斷后次數(shù),減輕服務(wù)程序的壓力。
      ----------------------------------------------
      學(xué)無(wú)止境
      作者:
      男 lulugo (找上帝說(shuō)理) ▲▲▲▲▲ -
      盒子活躍會(huì)員
      2015-2-1 16:51:29
      33樓: 關(guān)注
      ----------------------------------------------
      -努力成就未來(lái)....
      作者:
      男 wuxi15 (似水·流年) ▲▲▲△△ -
      注冊(cè)會(huì)員
      2015-2-1 17:22:41
      34樓: 頂樓主。
      各位想了解Datasnap客戶(hù)端互動(dòng)的可以看一下XE6的Demo。XE7下很多Demo沒(méi)有了。
      XE6下的Demo比較齊全,客戶(hù)端與服務(wù)端通訊,客戶(hù)端與客戶(hù)端通訊都有
      ----------------------------------------------
      我愛(ài)Delphi,我用Delphi http://www.cnblogs.com/wuxi15

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章