OpenDDS开发手册---第二章(开始)5

22 篇文章 3 订阅

2.2 数据处理优化

2.2.1 在发布者中注册并使用实例

    前面的示例隐式指定它通过示例数据发布的实例字段.当调用 write () 时, 数据编写器查询示例的键字段以确定实例。发布者还可以选择通过调用register_instance () 在数据写入者上:
Messenger::Message message;
message.subject_id = 99;
DDS::InstanceHandle_t handle =
message_writer->register_instance(message);
    在我们填充消息结构后, 我们调用 register_instance () 函数来注册实例。该实例由 subject_id 值99标识 (因为我们先前将该字段指定为键)。
    在发布示例时, 我们可以稍后使用返回的实例句柄:
DDS::ReturnCode_t ret = data_writer->write(message, handle);
    使用实例句柄发布示例的效率可能比强制写入者来查询实例, 并且在发布第一个示例时效率更高在第一个实例上。如果没有显式注册, 则第一次写入会导致资源分配OpenDDS 为该实例。
    由于资源限制可能导致实例注册失败, 因此许多应用程序考虑注册作为设置发布者的一部分, 并在初始化时始终执行数据写入者。

2.2.2 读取多个实例

dds 规范为读取和写入数据提供了许多操作样品.在上面的例子中, 我们使用了 take_next_sample () 操作, 来读取下一个样本, 并 "采取" 的所有权, 它从读者。Message数据读取器还具有下面进行操作。
·take ()-从读者中读取一个最大值为 max_samples 的序列
· take_instance ()-为指定的实例取值序列
· take_next_instance ()-取属于同一实例的样本序列,不指定实例
   还有一些 "read" 操作对应于这些 "take" 操作,获取相同的值, 但将示例保留在读取器中, 并简单地将它们标记为已读在SampleInfo中。
    由于这些其他操作读取了一系列值, 所以当样品快速到达。下面是一个示例调用 (), 它读取多达5示例时间
MessageSeq messages(5);
DDS::SampleInfoSeq sampleInfos(5);
DDS::ReturnCode_t status =
message_dr->take(messages,
sampleInfos,
5,
DDS::ANY_SAMPLE_STATE,
DDS::ANY_VIEW_STATE,
DDS::ANY_INSTANCE_STATE);

三状态参数可能专门针对哪些示例返回读者.有关其用法的详细信息, 请参阅 dds 规范。

2.2.3 零拷贝读取

    返回样本序列的读取和执行操作为用户提供获取样本副本的选项 (单次拷贝读取) 或对样本的引用(零拷贝读取)。零拷贝读取可以显著提高性能单次拷贝读取大样本类型。测试表明, 样品的8KB 或更少通过使用零拷贝读取不会获得太多好处, 但是对于使用对小样本进行零拷贝。
    应用程序开发人员可以指定使用零拷贝读取优化, 方法是调用take () 或read () 以零 max_len为0 构造的样本序列。Message序列和示例信息序列构造函数都将 max_len 作为它们的第一个参数, 并指定默认值为零。下面的代码示例取自
DevGuideExamples/DCPS/Messenger_ZeroCopy/DataReaderListenerImpl.cpp:
Messenger::MessageSeq messages;
DDS::SampleInfoSeq info;
// get references to the samples (zero-copy read of the samples)
DDS::ReturnCode_t status = dr->take(messages,
info,
DDS::LENGTH_UNLIMITED,
DDS::ANY_SAMPLE_STATE,
DDS::ANY_VIEW_STATE,
DDS::ANY_INSTANCE_STATE);

    在两个零拷贝采取或读和单采取或读之后, 样品和信息序列的长度设置为读取的样本数。对于零拷贝读取,max_len 设置为value >= length。
    由于应用程序代码要求对数据进行零拷贝贷款, 因此它必须返回贷款完成后的数据:

dr->return_loan(messages, info);

    调用 return_loan () 会导致序列的 max_len 被设置为 0, 其拥有成员设置为 false, 允许将相同的序列用于另一个零拷贝读取。
   如果数据示例序列构造函数和信息序列的第一个参数构造函数被更改为大于零的值, 则返回的示例值将是副本。当复制值时, 应用程序开发人员可以选择调用return_loan (), 但不要求这样做。
    如果未指定序列构造函数的 max_len (第一个) 参数, 则默认到 0;因此, 使用零拷贝读取。由于此默认值, 序列将自动调用return_loan (), 当它被摧毁。符合 dds 规范并可移植到 dds 的其他实现, 应用程序不应依赖于此自动return_loan () 功能。
  示例和信息序列的第二个参数是可用的最大插槽序列。如果take() 或read() 操作的 max_samples 参数大于此值, 则take() 或read() 返回的最大样本数将受此限制序列构造函数的参数。
    尽管应用程序可以更改零拷贝序列的长度, 但通过调用length (len) 操作, 建议您不要这样做, 因为此调用会导致复制数据, 并创建一个单次拷贝序列的样本。







  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
OpenDDS开发手册》是一本关于OpenDDS开发的指南手册OpenDDS是一款开放源代码的分布式对象管理系统(DDS)实现,用于构建实时、可扩展的分布式应用程序。 该开发手册旨在帮助开发者全面了解和掌握OpenDDS的基本概念、架构和核心功能。首先,手册介绍了DDS的概念和原理,包括发布订阅模型、主题、实体以及数据交流方式等基本概念。然后,手册详细讲解了OpenDDS的架构和组件,包括DCPS(数据中心发布者-订阅者)实现、实体管理、消息传递和数据序列化等。 随后,手册深入介绍了OpenDDS开发流程和常用工具。开发者将学习如何配置和部署OpenDDS环境,并了解如何使用IDL(接口定义语言)来定义数据类型和接口规范。手册还介绍了使用OpenDDS进行编译、构建和调试应用程序的方法,以及如何使用OpenDDS内置的功 能(如安全性、可靠性和持久性)提升应用程序的质量和性能。 此外,手册还详细说明了OpenDDS的高级特性和扩展功能。开发者将学习如何使用多线程、异步调用和事件通信机制来实现并发、高效的分布式应用程序。手册还介绍了如何利用OpenDDS的插件机制和QoS(服务质量)配置来定制系统行为,以及如何与其他开源技术(如数据库、Web服务)集成。 最后,手册提供了丰富的实例和案例,帮助开发者快速上手OpenDDS的应用开发。通过阅读本手册开发者将能够熟练掌握OpenDDS框架、API、工具和高级功能,从而能够高效地使用OpenDDS开发出可靠、高效的分布式应用程序。 总之,《OpenDDS开发手册》是一本系统、全面的指南,旨在帮助开发者学习和应用OpenDDS,提升其分布式系统开发的技能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道格拉斯范朋克

播种花生牛奶自留田

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值