服务器与客户端回叫

来源:互联网 发布:java wait await 区别 编辑:程序博客网 时间:2024/05/20 09:24

服务器与客户端回叫

   从Delphi2010开始,DataSnap支持回叫(Call Back)机制。这样,在调用耗时较长的方法时,通过回叫机制,返回服务器进程或正在处理的目标对象。

    一、客户端实现步骤
    在客户端声明TClientModule1的单元文件uClientModule中:
    1、声明一个从TDBXCallback继承下来的对象(用于回叫参数值),并实现复载的步骤。

type
  TInitCallback = class(TDBXCallback)
    function Execute(const Arg: TJSONValue): TJSONValue; override;
  end;

  TProgCallback = class(TDBXCallback)
    function Execute(const Arg: TJSONValue): TJSONValue; override;
  end;

    2、初始化创建该对象

Initialization      // 初始化 创建
  InitCallback := TInitCallback.Create;
  ProgCallback := TProgCallback.Create;

    3、实现声明的方法

function TProgCallback.Execute(const Arg: TJSONValue): TJSONValue;
begin
  with MainFrm do
  begin
    ProgressBar1.Position  := TJSONNumber(Arg).AsInt;
    Button5.Enabled := (TJSONNumber(Arg).AsInt = ProgressBar1.Max);
  end;
  //刷新屏幕
  Application.ProcessMessages;
  Result := TJSONNull.Create;     // 回传Null值
end;

function TInitCallback.Execute(const Arg: TJSONValue): TJSONValue;
begin
  with MainFrm do
  begin
    ProgressBar1.Max := TJSONNumber(Arg).AsInt;
    ProgressBar1.Step := 5;
    Edit1.Text := '总时长:' + TJSONNumber(Arg).ToString + '秒';
    Button5.Enabled := False;
  end;
  Result := TJSONNull.Create;
end;

    4、调用回叫方法
procedure TMainFrm.Button5Click(Sender: TObject);
begin
  ClientModule1.ServerMethods1Client.LongTimeRunFunc(InitCallback, ProgCallback);
end;

    二、服务器端实现步骤
    在服务器端声明TServerMethods1的单元文件uServerMethods中:
    1、编写一个带回叫机制的方法
    在方法的形参中,带入客户端的回叫参数:

function TServerMethods1.LongTimeRunFunc(InitCallback, ProgCallback: TDBXCallback): boolean;
var Max: Integer;
    I: Integer;
begin
  Max := Random(120) + 1;
  InitCallback.Execute(TJSONNumber.Create(Max)).Free;   // 将Max值通过JSON格式,通过InitCallback执行回叫后,释放该对象
  for I := 0 to Max do
  begin
    ProgCallback.Execute(TJSONNumber.Create(I)).Free;   // 将I值通过JSON格式,通过ProgCallback执行回叫后,释放该对象
    sleep(1000);
  end;
  Result := True;
end;

    2、声明该方法

  public
    { Public declarations }
    function LongTimeRunFunc(InitCallback, ProgCallback: TDBXCallback): boolean; 

    三、客户端声明服务器端输入方法的对象
    服务器端声明的方法(对象),需要在客户端中声明,才能使得二者之间实现数据传递。
    1、执行服务器端程序。
    2、在客户端的ClientModule1的单元,通过鼠标右键点击SQLConnection1,选择“Generate DataSnap client classses”项目。

    四、运行机制
    客户端声明的TProgCallback是继承TDBXCallback的对象,它复载虚方法Execute,在服务器端运行,接受一个TJSONValue的参数,并且回传一个TJSONValue的结果值。TDBXCallback的回叫机制很有意思:服务器端在回叫客户端的方法时,可以将需要回传缎带客户端的值或对象,以TJSONValue的形式,当作虚方法Execute的参数回传缎带客户端,而客户端的方法,在被回叫执行完毕后,也可以将执行结果,以TJSONValue的形式,回传给服务器端。

原创粉丝点击