gpt4 book ai didi

delphi - 使用 DataSnap 进行大流处理

转载 作者:行者123 更新时间:2023-12-03 15:26:12 29 4
gpt4 key购买 nike

我试图在 DataSnap 服务器/客户端之间传输一些大流(~1Mb),但无济于事。我试图理解 Jim Tierney ( http://blogs.embarcadero.com/jimtierney/2009/04/06/31461 ) 的代码,但运气不佳,而且由于缺少库,我什至无法编译代码......

我能够接收的流的最大大小是 64k,因此您可以为像我这样的周末程序员提供任何提示/想法/代码示例受到热烈欢迎。谢谢!

我的服务器代码:

function TsrvMethods.getStream(iCount: integer): TStream;
begin
Result := dummyStream('0123456789', iCount);
end;

function dummyStream(sCnt: string; iCount: integer): TStream;
begin
Result := TMemoryStream.Create;
while iCount > 1 do begin
Result.Write(Pointer(sCnt)^, Length(sCnt));
Dec(iCount);
end;
Result.Seek(0, TSeekOrigin.soBeginning);
end;

我的客户调用代码:

procedure TfrmMain.butStreamClick(Sender: TObject);
var
sStr : TStream;
begin
cycleConnection; //make sure we have an active connection

with TsrvMethodsClient.Create( SQLConn.DBXConnection, False ) do begin
sStr := getStream( Integer(SpinCount.Value) );
Free;
end;
FreeAndNil(sStr);
end;

最佳答案

事实上,我想我已经明白了。我将此作为答案发布,也许其他人需要这个。

procedure TfrmMain.butStreamClick(Sender: TObject);
const
iBufSize = 128;
var
sStr : TStream;
sMem : TMemoryStream;
buf: PByte;
iRead: integer;
begin
cycleConnection;

with TsrvMethodsClient.Create( SQLConn.DBXConnection, False ) do begin

sStr := getStream( 500000 ); //500k stream

GetMem(buf, iBufSize);
sMem := TMemoryStream.Create;
try
repeat
iRead := sStr.Read( Pointer(buf)^, iBufSize);

if iRead > 0 then sMem.WriteBuffer( Pointer(buf)^, iRead);
if iRead < iBufSize then break;
until iRead < iBufSize;
finally
FreeMem(buf, iBufSize);
end;

Free;
end;
FreeAndNil(sStr);
FreeAndNil(sMem);
end;

附注

通过搜索 DataSnap 代码示例,我发现一个(与速度相关的)改进是将 iBufSize 设置为 61440(或等效的十六进制值 $F000),这似乎是可以一次性接收的最大大小。如果接收流较大,则报告的大小将为 -1,并且需要上面的代码来读取整个流。

关于delphi - 使用 DataSnap 进行大流处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1779409/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com