美文网首页
ZServer4D中HPC服务简单示范

ZServer4D中HPC服务简单示范

作者: abctel | 来源:发表于2018-10-31 10:54 被阅读0次

HPC将数据操作放到子线程中运行,大大提高了Server端的运行效率,因为默认的运行都在主线程中,会造成阻塞。

简单的说就是:

电影院只有一个卖票窗口,100个人买票就会在这个窗口等待销售员一个个的销售等卖完就会花费很多时间,HPC的作用相当于增设卖票窗口,让多个销售员同时能面对多个用户,减少用户等待时间。

代码示范:

Server代码

procedure TMyService.cmd_Stream_Result(Sender: TPeerClient; InData, OutData: TDataFrameEngine);
var
  UserIO: TPeerClientUserDefineForRecvTunnel_VirtualAuth;
begin
  UserIO := GetUserDefineRecvTunnel(Sender);
  // 验证是否登陆成功
  if not UserIO.LoginSuccessed then
    Exit;
  DoStatus('登陆验证');

  // 验证通讯端口是否创建成功
  if not UserIO.LinkOk then
    Exit;
  DoStatus('端口验证');

  // 将数据查询工作放到子线程操作(改成HPC其实就是加这么个函数,这也是我喜欢ZServer4D这个框架的原因,代码简单、便捷,要实现什么功能几行代码即可)
  CommunicationFramework.RunStreamWithDelayThreadP(Sender, nil, nil, InData, OutData,
    procedure(Sender: TStreamCmdThread; ThInData, ThOutData: TDataFrameEngine)
    var
    Stm: TMemoryStream;
    begin
      //初始化用到的变量
      Stm := TMemoryStream.Create;
      try
        MyDM.fdqry1.Close;
        MyDM.fdqry1.Sql.Clear;
        MyDM.fdqry1.Sql.Add(ThInData.Reader.ReadString);
        MyDM.fdqry1.Open;
        MyDM.fdqry1.SaveToStream(Stm, TFDStorageFormat.sfBinary);
        // Stream1.Position:=0;
        DoStatus('未压缩 CRC32:' + TCipher.GenerateHashString
          (THashSecurity.hsCRC32, Stm.Memory, Stm.Size));
        // 将结果返回Client
        ThOutData.WriteStream(Stm);
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
      DisposeObject([Stm]);
    end);
end;

Client代码
Client发送端的代码其实就是正常发送代码,HPC功能实现只需要改造Server端注册的申明

procedure TAuthDoubleTunnelClientForm.Button1Click(Sender: TObject);
var
SendDe,ResultDE:TDataFrameEngine;
Stm:TMemoryStream;
begin
//初始化用到的变量
SendDe:=TDataFrameEngine.Create;
ResultDE:=TDataFrameEngine.Create;
Stm:=TMemoryStream.Create;
//将需要查询的命令放入SendDe变量
SendDe.WriteString(Edit1.Text);
//发送到服务端并等待服务端的反馈
client.SendTunnel.WaitSendStreamCmd('cmd_Stream_Result',SendDe,ResultDE,5000);
//从ResultDE获取服务端返回的数据
ResultDE.Reader.ReadStream(Stm);
//生成反馈数据的CRC32数据,方便与服务端对比数据发送完整性
DoStatus('未解压 CRC32:'+TCipher.GenerateHashString(THashSecurity.hsCRC32,Stm.Memory,Stm.Size));
//载入
//载入到FDMemTable中后与DBGrid连接,用DBGrid显示数据
FDMemTable1.LoadFromStream(Stm,TFDStorageFormat.sfJSON);
DisposeObject([SendDe,ResultDE,Stm]);
end;

相关文章

网友评论

      本文标题:ZServer4D中HPC服务简单示范

      本文链接:https://www.haomeiwen.com/subject/skbotqtx.html