Fast DDS中的定时器

本文详细介绍了FastDDS中的定时器组件,包括ResourceEvent类的作用、TimedEvent的使用方法(如创建、启动、回调和停止)、以及如何通过代码实现定时任务。还提到了类图的关键部分和ResourceEvent内部的数据结构和同步机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定时器使用

Fast DDS中定时器是通过一条线程运行多个定时器的模式,线程的生命周期由ResourceEvent管理,并且用户定义的TimedEvent也是在ResourceEvent调度执行定时器函数,所以,当用户定义1个或多个定时器之前时,首先需要初始化一个ResourceEvent对象,然后再创建TimedEvent定时器,具体有以下步骤:

  1. 创建一个ResourceEvent对象,并调用其init_thread方法构造eprosima::thread对象,此时,ResourceEvent创建的线程函数开始运行;
  2. 构造TimedEvent对象,需要提供提供一个回调函数,和上一步创建的ResourceEvent对象;
  3. 调用TimedEvent对象的restart_timer()方法将创建的TimedEvent对象添加到ResourceEvent对象用于管理TimedEventImpl的数据成员中,定时器开始运行
  4. 停止TimeEvent。你可以调用TimeEvent的cancel()函数来停止定时器。

Fast DDS中使用代码如下(RTPSParticipantImpl类中定义的ResourceEvent举例):

// ResourceEvent的构造和线程初始化
ResourceEvent mp_event_thr;
mp_event_thr.init_thread(thr_config, "dds.ev.%u", id_for_thread);
// PDP中TimedEvent的构造
TimedEvent* resend_participant_info_event_;
resend_participant_info_event_ = new TimedEvent(mp_RTPSParticipant->getEventResource(),
                    [&]() -> bool
                    {
                        announceParticipantState(false);
                        set_next_announcement_interval();
                        return true;
                    },
                    0);
// 开启ResourceEvent中的定时器
 resend_participant_info_event_->restart_timer();->restart_timer();

代码分析

Fast DDS中的定时器主要有三个类组成:ResourceEvent,TimedEventImpl, TimedEvent。
类图如下:
定时器类图
定时器的核心实现放在TimedEventImpl中,所以核心类有两个:ResourceEvent和TimedEventImpl,TimedEvent主要用于为用户提供接口。

时序图
RTPS定时器时序图

### Fast DDS 的相关信息与使用教程 Fast DDS 是 eProsima 提供的一个高性能 C++ 实现,遵循 Data Distribution Service (DDS) 规范[^1]。它最初名为 Fast RTPS,在后续版本中扩展支持完整的 DDS 功能并更名为 Fast DDS。以下是关于其官方文档和使用教程的内容: #### 官方文档 Fast DDS 提供详尽的官方文档来帮助开发者快速上手和深入理解该工具的功能。这些文档涵盖了安装指南、API 参考以及高级配置等内容。可以通过以下链接访问官方文档页面: - **官方文档地址**: [Fast DDS Documentation](https://fast-dds.docs.eprosima.com/en/latest/index.html)[^2] #### 使用教程 为了便于学习如何使用 Fast DDS,eProsima 还提供了多个示例程序和详细的项目教程。 1. **入门示例** - 官方提供了一个简单的发布者/订阅者模型示例,演示了如何创建基本的数据流传输应用。 - 示例代码通常位于源码仓库中的 `examples` 文件夹下。 ```cpp // 创建发布者的初始化逻辑 Participant participant; Publisher publisher(participant); Topic<HelloWorld> topic("HelloWorldTopic"); HelloWorldDataWriter writer(topic); while(true){ HelloWorld hello; hello.index(writer.get_count()); std::stringstream ss; ss << "Message " << hello.index(); hello.message(ss.str()); writer.write(hello); std::this_thread::sleep_for(std::chrono::seconds(1)); } ``` 2. **GitHub 项目资源** - 用户可以克隆 GitHub 上的 Fast DDS 项目库获取更多样例代码。 - 地址: [GitCode Mirror Repository](https://gitcode.com/gh_mirrors/fa/Fast-DDS) 3. **视频教程** - 对于更直观的学习方式,可以在 YouTube 或其他平台上查找由社区成员制作的教学视频。 4. **常见问题解答** - 如果遇到具体技术难题,可查阅官方 FAQ 页面或者加入 eProsima 社区论坛寻求帮助。 通过上述资料,用户能够全面掌握 Fast DDS 的核心概念及其实际操作技巧。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值