当前位置: 首页 > news >正文

fastdds qos:LifespanQosPolicy

在实际业务中,如果对数据的新/旧程度有要求,比如数据产生之后如果1ms都没有被使用,那么数据就相当于过期了,没有使用价值了,这种数据直接丢弃就可以了。如果有这种需求,那么可以考虑结合LifespanQosPolicy来实现。

(1)当DataWriter写数据History的数据,或者接收数据到DataReader的History的数据,均可以加时间戳

DataWriter侧写sourceTimestamp:

bool WriterHistory::prepare_and_add_change(

        CacheChange_t* a_change,

        WriteParams& wparams)

{

       ...

       a_change->sourceTimestamp = wparams.source_timestamp();

      ...

}

数据接收侧写sourceTimestamp:

bool MessageReceiver::proc_Submsg_DataFrag(

        CDRMessage_t* msg,

        SubmessageHeader_t* smh,

        bool was_decoded) const

{

    ...

    if (have_timestamp_)

    {

        ch.sourceTimestamp = timestamp_;

    }

    ...

}

(2)定时器

如果DataWriter或者DataReader使能了LifespanQosPolicy时,那么便会创建定时器来监督是不是有数据超时。

如下是DataWriter创建定时器的代码:

    lifespan_timer_ = new TimedEvent(publisher_->rtps_participant()->get_resource_event(),

                    [&]() -> bool

                    {

                        return lifespan_expired();

                    },

                    qos_.lifespan().duration.to_ns() * 1e-6);

在函数lifespan_expired中判断如果有数据超时,便会通过函数remove_change_pub将数据移出。

bool DataWriterImpl::lifespan_expired()

{

    while (history_->get_earliest_change(&earliest_change))

    {

  

        if (now - source_timestamp < lifespan_duration_us_)

        {

            auto interval = source_timestamp - now + lifespan_duration_us_;

            lifespan_timer_->update_interval_millisec(static_cast<double>(duration_cast<milliseconds>(interval).count()));

            return true;

        }

        // The earliest change has expired

        history_->remove_change_pub(earliest_change);

}

(3)example测试

通过helloworld进行测试,将超时时间设置的非常短100ns,实际测试可以看到DataReader接收不到DataWriter发送的数据。

writer_qos.lifespan().duration = eprosima::fastdds::dds::Duration_t(0,100);

reader_qos.lifespan().duration = eprosima::fastdds::dds::Duration_t(0,100);

默认情况下,lifespan qos策略不生效,也就是在History中的数据不存在超时的情况。

http://www.xdnf.cn/news/1401805.html

相关文章:

  • 【C++】类和对象(终章)
  • 第二十六天-待机唤醒实验
  • 信息系统架构
  • v-model ,在 vue3和 vue2中的区别
  • Linux(1)|入门的开始:Linux基本指令
  • 认识Redis
  • IDM手机端,速度能提高6倍!
  • CPU的MBR寄存器和MDR寄存器
  • 联合体和枚举——嵌入式学习笔记
  • Linux IO复用
  • 优选算法:二分查找
  • 数据库攻略:“CMU 15-445”Project0:C++ Primer(2024 Fall)
  • 《Java反射与动态代理:从原理到实践》
  • SpringBoot整合Actuator实现健康检查
  • MIT 6.5840 (Spring, 2024) 通关指南——Lab 1: MapReduce
  • GitHub 热榜项目 - 日榜(2025-08-30)
  • 基于Ubuntu本地GitLab 搭建 Git 服务器
  • 解构机器学习:如何从零开始设计一个学习系统?
  • 【LeetCode】大厂面试算法真题回忆(121) —— 经典屏保
  • 并发编程——09 CountDownLatch源码分析
  • Spring Boot 后端接收多个文件的方法
  • 项目管理常用的方法有哪些
  • 三菱 PLC的中断指令/中断指针
  • 构建现代化的“历史上的今天“网站:从API到精美UI的全栈实践
  • 北方苍鹰优化算法优化的最小二乘支持向量机NGO-LSSVM多输入多输出回归预测【MATLAB】
  • 2025年06月 Scratch 图形化(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • Robolectric如何启动一个Activity
  • 倾斜摄影是选择RGB图像还是多光谱影响进行操作?
  • Transformer:从入门到精通
  • 嵌入式Linux驱动开发:蜂鸣器驱动