我有一个客户端服务器应用程序。客户端(TCP )是一个Delphi应用程序,它向服务器(TCP,C++ Builder应用程序)发送命令。
它们都是用Rad Studio XE2编写的。
服务器响应命令,从server获取数据并将其发送给客户端。
服务器使用TClientDataSet并将其保存到发送到客户端的TMemoryStream。
客户端还使用TClientDataSet,并对从服务器接收的流调用TClientDataSet.LoadFromStream()。
效果很好。
但是,在数据大小较大(~160 MB)的情况下,有时在客户端调用TClientDataSet.LoadFromStream()时抛出“创建变体或安全数组的错误”。
服务器以这种方式将流发送到客户端:
//...
FContext->Connection->IOHandler->LargeStream = true;
FContext->Connection->IOHandler->Write(Stream, 0, true);客户端以这种方式接收它:
AClient.IOHandler.LargeStream := True;
AClient.IOHandler.ReadStream(Stream, -1, False);客户端接收后,它将流的位置更改为18。
因为实际数据在18个字节后开始。然后它调用TClientDataSet.LoadFromStream().
//...
MemTable.LoadFromStream(Stream);LoadFromStream()正在抛出“创建变体或安全数组的错误”。但在某些情况下,它没有错误地发挥作用。
有人知道吗?
发布于 2017-01-12 16:51:06
基于Delphi10的源代码,问题来自于SafeArrayCreate失败,很可能是因为EOutOfMemory异常。
SafeArrayCreate试图分配160 to的内存,这需要是连续的。有可能在进程的虚拟内存中没有足够大的“洞”来容纳那么多内存。在32位的过程中,我想这并不是不太可能的。
稍微减轻问题的一种方法可能是激活/LARGEADDRESSAWARE标志。但这只会略微降低错误发生的可能性,而且可能很快就会再次出现。
其他备选办法包括:
https://stackoverflow.com/questions/41616773
复制相似问题