JSON 程式设计 – DataSnap的回叫机制

上传人:cl****1 文档编号:512293696 上传时间:2023-09-15 格式:DOCX 页数:11 大小:254.46KB
返回 下载 相关 举报
JSON 程式设计 – DataSnap的回叫机制_第1页
第1页 / 共11页
JSON 程式设计 – DataSnap的回叫机制_第2页
第2页 / 共11页
JSON 程式设计 – DataSnap的回叫机制_第3页
第3页 / 共11页
JSON 程式设计 – DataSnap的回叫机制_第4页
第4页 / 共11页
JSON 程式设计 – DataSnap的回叫机制_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《JSON 程式设计 – DataSnap的回叫机制》由会员分享,可在线阅读,更多相关《JSON 程式设计 – DataSnap的回叫机制(11页珍藏版)》请在金锄头文库上搜索。

1、JSON程式設計-DataSnap的回叫機制DataSnap 2010 加入了回叫機制,當伺服端方法在執行的過程中可以回叫用戶端 提供的方法以通知用戶端有關伺服端方法執行的狀態。DataSnap 的回叫機制非常適合使用在需要較長時間執行的伺服端方法,例如如 果伺服端方法需要執行長時間的查詢時就很適合使用,或是當程式啟動或是執行 時需要進行許多查詢的工作,那麼也都可以使用回叫機制。要使用DataSnap 2010的回叫機制非常的簡單,開發人員只需要實作一個從 TDBXCallback 繼承下來的實體類別,並且在呼叫伺服端方法時把此實體類別的 樣例當做參數傳遞給伺服端方法即可。由於使用DataSn

2、ap 2010的回叫機制並不困難,因此讓我們使用一個範例來說明 讀者就可以很快的瞭解。在下列的範例中本文將使用Delphi 2010中新的IOUtils程式單元中的類別進行 檔案搜尋和計數的工作,由於這將花上一些時間,因此我們正好使用它來展示使 用同步和回叫機制的差異。範例 DataSnap 伺服器首先讓我們建立一個 DataSnap 伺服端,下面是這個伺服器輸出的伺服端方法, 請注意的是,TServerMethodsl 輸出了兩個方 法 GetServerDirectorylnfo 和 GetServerDirectorylnfoAsync。這兩個方法都執行相同的工作,它們使用 TDirec

3、tory類別搜尋和計數特定伺服端目錄下的檔案總數,它們的差異是 GetServerDirectoryInfo 使用同步的方式執行,因此當 用戶端呼叫它時,用戶 端會同時暫停反應直到 GetServerDirectoryInfo 執行完畢。而 GetServerDirectoryInfoAsync 則是使用回叫機制的方式執行,因此當用戶端 呼叫它之後, GetServerDirectoryInfoAsync 在執行的過程中則可以藉由用戶端 傳遞來的參數ACallback: TDBXCallback,來回叫回用戶端,告訴用戶端執行的 狀態,用戶端因此也根據目前伺服端執行的情形來更新用戶端的資訊。$

4、METHODINFO ONTServerMethods1 = class(TPersistent)private Private declarations fTotalFiles : Integer;FResult : TJSONArray;FCallback: TDBXCallback;procedure ProcessPath(const sPath : string);procedure ProcessPathAsync(const sPath : string);procedure ShowMessage(sMessage : string);procedure ProcessThis

5、Directory(const sPath : string);public Public declarations function EchoString(Value: string): string;function GetServerDirectoryInfo(const sPath : string) : TJSONArray;function GetServerDirectoryInfoAsync(ACallback: TDBXCallback; const sPath : string): TJSONArray;end;$METHODINFO OFFGetServerDirecto

6、ryInfoAsync 是如何回叫回用戶端呢?其實非常的簡單,因為 用戶端在呼叫它時已經把用戶端的回叫方法當成參數傳遞過來了,因此GetServerDirectoryInfoAsync 只需要藉由這個參數即可回叫回用戶端。因此我們可以從下面 18行的程式碼看到,伺服端直接使用這個回叫參數呼叫用 戶端,並且建立一個 TJSONString 型態的物件做為參數,在這個 TJSONString 物件中告訴了用戶端目前伺服端正在處理那一個目錄。001 function TServerMethods1.GetServerDirectoryInfoAsync(ACallback: TDBXCallback

7、;002 const sPath: string): TJSONArray;003 begin004 FCallback := ACallBack;005FTotalFiles := 0;006FResult := TJSONArray.Create;007ProcessPathAsync(sPath);008FResul t.AddElemen t(TJSONS tring.Crea te( 總檔案數+ : +IntToStr(FTotalFiles);009 Result := FResult;010 end;011012 procedure TServerMethods1.Process

8、PathAsync(const sPath: string);013 var014rootDirectories : TStringDynArray;015i: Integer;016 begin017ProcessThisDirectory(sPath);018FCallback.Execu te(TJSONS tring.Create( 處理目錄+ sPath +中);019rootDirectories := TDirectory.GetDirectories(sPath);020 for i :二 0 to Length(rootDirectories) - 1 do021Proces

9、sPathAsync(rootDirectoriesi);022 end;同步用戶端範例的同步用戶端非常的簡單,它只是直接呼叫伺服端的GetServerDirectorylnfo 方法。procedure TForm3.btnGetServerInfoClick(Sender: TObject);varaServer : TServerMethods1Client;ja : TJSONArray;jv : TJSONValue;I: Integer;beginlStart := GetTickCount;aServer := TServerMethods1Client.Create(Self.

10、SQLConnection1.DBXConnection);tryja := aServer.GetServerDirectoryInfo(Edit1.Text);lEnd := GetTickCount;for I :二 0 to ja.Size - 1 dobeginjv := ja.Get(I); lbResult.Items.Add(jv.ToString);end;finallyaServer.Free;ShowRunTime(lEnd - lStart);end;end;在用戶端呼叫 GetServerDirectoryInfo 的過程中,用戶端暫停反應,使用者也 無從瞭解伺服端執

11、行的狀態。回叫用戶端再看看回叫用戶端,這個用戶端的關鍵從下面的 012 行開始,012行建立了 TDSCallbackWithMethod 物件,並且建立一個 匿名方法做為用戶端的回叫方法 傳遞給伺服端。從 013 行開始的匿名方法在被用戶端回叫的時候首先在 013 行把 伺服端傳遞來的參數型態轉換為 TJSONString 的型態,接著更新用戶端的 UI 以 通知使用者伺服端目前正在處理那一個目錄。最後在 023 行用戶端回叫方法如果 執行成功就需要回傳 TJSonTrue 物件,如果失敗的話就需要回傳 TJSonFalse 物 件。001procedure TForm3.btnGetSer

12、verInfoAsyncClick(Sender: TObject);002var003aServer : TServerMethods1Client;004LCallback : TDSCallbackWithMethod;005ja : TJSONArray;006jv : TJSONValue;007I: Integer;008begin009lStart := GetTickCount;010 aServer :=TServerMethods1Client.Create(Self.SQLConnection1.DBXConnection);011try012LCallback := T

13、DSCallbackWithMethod.Create(013function(const Args: TJSONValue): TJSONValue014var015asyncResult: TJSONString;016I: Integer;017LMessage: string;018begin019asyncResult := TJSONString(Args);020lbAsync.Items.Add(asyncResult.ToString);021lbAsync.Update;022Application.ProcessMessages;023Result := TJSonTru

14、e.Create;024end025 );026 ja := aServer.GetServerDirectoryInfoAsync(LCallback, Edit1.Text);027028029lEnd := GetTickCount;030for I :二 0 to ja.Size - 1 do031begin032jv := ja.Get(I);033lbResult.Items.Add(jv.ToString);034end;035finally036aServer.Free;037ShowRunTime(lEnd - lStart);038end;039end;那麼什麼是TDSCa

15、llbackWithMethod類別呢?這要從TDBXCallback抽象類別開 始談起。TDBXCallback 抽象類別 在討論TDSCallbackMethod之前我們必須先說明TDBXCallback抽象類別,因為 TDSCallbackMethod是從TDBXCallback繼承下來的實體類別。事實上 TDBXCallback類別即是使用DataSnap 2010回叫機制的關鍵,要使用回叫機制, 開發人員必須實作一個從TDBXCallback繼承下來的實體類別,並且傳遞此實體 類別的樣例給伺服端方法做 為參數,如此一來伺服端方法就可以藉由這個樣例 參數呼叫回用戶端,以通知用戶端伺服端方法執行的狀態。TDBXCallback 的虛擬方法 Execute 是衍生類別需要複載實作的, Execute 接受一 個型態為TJSONValue的參數並 且回傳一個型態為TJSONValue的結果值,伺服 端方法在回叫用戶端的方法時,可以把需要傳遞給用戶端的數值或是物件轉換為 TJ

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号