目录
定时器使用
Fast DDS中的定时器主要有三个类组成:ResourceEvent,TimedEventImpl, TimedEvent。
ResourceEvent中管理定时器线程,当用户启动定时器时,需要开启ResourceEvent中的定时器线程,具体有以下步骤:
- 创建一个TimeEvent对象。在创建对象时,你需要提供一个回调函数,以及一个时间间隔。
- 启动TimeEvent。你可以调用TimeEvent的restart()函数来启动或重启定时器。
- 在回调函数中处理定时事件。当定时器到达预设的时间间隔时,会自动调用你提供的回调函数。
- 停止TimeEvent。你可以调用TimeEvent的cancel()函数来停止定时器。
使用代码如下:
cpp
// 定义两个变量:
ResourceEvent test_resource_;
TimedEvent* test_timer_{nullptr};
// 开启ResourceEvent中的定时器,并创建TimedEvent实例:
test_timer_= new TimedEvent(test_resource_,
std::bind(&TestClass::timer_callback, this),
interval_time_.minimum_separation.seconds * 1000 + att.interval_time_.minimum_separation.nanosec / 1000000
);
test_timer_->restart_timer();
此时就开始按照指定的周期开始调用定时器函数&TestClass::timer_callback。
代码分析
类图如下:
TODO
第一步,初始化一个ResourceEvent 实例。
ResourceEvent 中的变量说明:
cpp
std::atomic<bool> stop_{ false }; // 定时器线程是否执行
TimedMutex mutex_; // 用来保护ResourceEvent内部的数据成员
//! Used to warn about changes on allow_vector_manipulation_.
TimedConditionVariable cv_manipulation_;
//! Flag used to allow a thread to manipulate the timer collections when the execution thread is not using them.
bool allow_vector_manipulation_ = true;
//! Used to warn there are new TimedEventImpl objects to be processed.
TimedConditionVariable cv_;
//! 创建的定时器个数
size_t timers_count_ = 0;
//! Collection of events pending update action.
std::vector<TimedEventImpl*> pending_timers_;
//! Collection of registered events waiting completion.
std::vector<TimedEventImpl*> active_timers_;
//! Prevents iterator invalidation when active_timers are manipulated inside loops
std::atomic<bool> skip_checking_active_timers_;
//! 当前时间
std::chrono::steady_clock::time_point current_time_;
//! 定时器线程
std::thread thread_;