首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi中TClientDataSet.LoadFromStream()中的“创建变体或安全数组错误”

Delphi中TClientDataSet.LoadFromStream()中的“创建变体或安全数组错误”
EN

Stack Overflow用户
提问于 2017-01-12 15:19:20
回答 1查看 1.4K关注 0票数 1

我有一个客户端服务器应用程序。客户端(TCP )是一个Delphi应用程序,它向服务器(TCP,C++ Builder应用程序)发送命令。

它们都是用Rad Studio XE2编写的。

服务器响应命令,从server获取数据并将其发送给客户端。

服务器使用TClientDataSet并将其保存到发送到客户端的TMemoryStream

客户端还使用TClientDataSet,并对从服务器接收的流调用TClientDataSet.LoadFromStream()

效果很好。

但是,在数据大小较大(~160 MB)的情况下,有时在客户端调用TClientDataSet.LoadFromStream()时抛出“创建变体或安全数组的错误”

服务器以这种方式将流发送到客户端:

代码语言:javascript
复制
//...
FContext->Connection->IOHandler->LargeStream = true;
FContext->Connection->IOHandler->Write(Stream, 0, true);

客户端以这种方式接收它:

代码语言:javascript
复制
AClient.IOHandler.LargeStream := True;
AClient.IOHandler.ReadStream(Stream, -1, False);

客户端接收后,它将流的位置更改为18。

因为实际数据在18个字节后开始。然后它调用TClientDataSet.LoadFromStream().

代码语言:javascript
复制
//...
MemTable.LoadFromStream(Stream);

LoadFromStream()正在抛出“创建变体或安全数组的错误”。但在某些情况下,它没有错误地发挥作用。

有人知道吗?

EN

回答 1

Stack Overflow用户

发布于 2017-01-12 16:51:06

基于Delphi10的源代码,问题来自于SafeArrayCreate失败,很可能是因为EOutOfMemory异常。

SafeArrayCreate试图分配160 to的内存,这需要是连续的。有可能在进程的虚拟内存中没有足够大的“洞”来容纳那么多内存。在32位的过程中,我想这并不是不太可能的。

稍微减轻问题的一种方法可能是激活/LARGEADDRESSAWARE标志。但这只会略微降低错误发生的可能性,而且可能很快就会再次出现。

其他备选办法包括:

  • 编译为64位应用程序。
  • 使用正确的数据库而不是内存中的数据集.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41616773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档