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;
网友评论