gpt4 book ai didi

delphi - 在DCOM中传输记录最快的方法是什么

转载 作者:行者123 更新时间:2023-12-02 00:12:01 25 4
gpt4 key购买 nike

我想使用 COM/DCOM 在两台 Windows PC 计算机之间传输具有以下结构的一些记录。我更喜欢一次传输一个数组,例如 TARec 的 100 名成员,而不是单独传输每个记录。目前我正在使用 IStrings 执行此操作。我希望使用原始记录来改进它,以节省两端编码/解码字符串的时间。请分享您的经验。

type
TARec = record
A : TDateTime;
B : WORD;
C : Boolean;
D : Double;
end;

所有记录的字段类型均与 OLE 兼容。非常感谢。

最佳答案

正如 Rudy 在评论中建议的那样,如果您的数据包含简单的值类型,那么变体字节数组可能是一种非常有效的方法,并且实现起来非常简单。

既然您已经声明您的数据已经驻留在数组中,则基本方法是:

  1. 创建所需大小的字节数组来保存所有记录数据(使用类型为 varByteVarArrayCreate)

  2. 锁定数组以获取可安全用于引用内存中数组内容的指针(VarArrayLock 将锁定并返回指向数组数据的指针)

  3. 使用CopyMemory直接将数据从记录数组复制到字节数组内存。

  4. 解锁变体数组 (VarArrayUnlock) 并通过 COM/DCOM 接口(interface)传递它

在另一侧(“接收”),您只需反转该过程即可:

  1. 声明所需大小的记录数组
  2. 锁定变体字节数组以获得指向保存字节的内存的指针
  3. 将字节数组数据复制到记录数组中
  4. 解锁字节数组

我过去在要求非常严格的 COM/DCOM 场景(w.r.t 效率/性能)中非常成功地使用了这种方法。

注意事项:

  • 如果您的数据发生更改以包含更复杂的类型(例如字符串或动态数组),则需要进行额外的工作才能通过字节数组正确传输这些数据。

  • 如果您的数据结构发生变化,那么界面两侧的代码都需要相应更新。防止这种情况的一种方法是采用某种机制来让接收者识别数据是否有效。例如,这可能包括一个“版本号”和/或一个值(在“ header ”中作为字节数组的一部分,除了数组数据之外,或者完全作为单独的参数传递 - 精确的细节并不重要)。如果接收方发现它不期望的版本号或大小,那么它可以优雅地报告这一点,而不是天真地错误地处理数据并(很可能)导致崩溃或抛出异常。

  • 对齐/包装问题。即使记录类型的声明相同,如果使用不同的对齐设置编译代码,那么内存中每个记录所需的大小也可能会发生变化(这就是为什么数据结构格式的“版本号”本身可能不可靠)。避免这种情况的一种方法是将记录声明为打包,尽管这会以稍微降低效率为代价(并且仍然依赖于接口(interface)双方都同意数据结构是打包)。

但是,有一些事情需要牢记,而不是规定性的。您的实现需要有多复杂/稳健将取决于您的具体情况。

关于delphi - 在DCOM中传输记录最快的方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39064627/

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