当前位置: 首页 > 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.dtcms.com/a/358888.html

相关文章:

  • 2025年- H101-Lc209--1979.找出数组的最大公约数(gcd最大公约数)--Java版
  • STM32G474 IAP 双bank升级的坑
  • git的三种分区与分支的关系
  • Pomian语言处理器研发笔记(二):使用组合模式定义表示程序结构的语法树
  • for in+逻辑表达式 生成迭代对象,最后转化为列表 ——注意list是生成器转化为列表,但[生成器]得到的就是一个列表,其中包含一个生成器元素
  • HarmonyOS 持久化存储:PersistentStorage 实战指南
  • Kafka面试精讲 Day 2:Topic、Partition与Replica机制
  • Midscene.js:AI驱动的UI自动化测试框架
  • PLSQL Developer 12.0.1 x64 安装步骤详解(附Oracle连接设置|附安装包下载)​
  • SQL 学习
  • 探索 XGBoost 与 LightGBM 的差异:哪个更适合你的项目?
  • 【Pytorch】生成对抗网络实战
  • 快消品牌如何用 DAM 管理万张素材?
  • Coze源码分析-API授权-编辑令牌-后端源码
  • MySQL视图、存储过程与触发器详解
  • 实战指南|解锁 Highcharts 图表导出与数据格式优化
  • windows32位下载谷歌浏览器的地址
  • Git提交信息
  • 不用公网IP也能?cpolar实现Web-Check远程安全检测(1)
  • Qt 窗口 - 3
  • 弱内存模型和强内存模型架构(Weak/Strong Memory Model)
  • stack queue的实现 deque的底层结构 priority_queue的实现
  • easy-http类似feign的轻量级http客户端工具
  • C++三方服务异步拉起
  • 针对 “TCP 连接中断 / 终止阶段” 的攻击
  • K8s卷机制:数据持久化与共享
  • 当“循环经济”遇上“小程序”,旧物回收正迎来“智慧”升级
  • 奥普新汽车声学测试方案书
  • 谷歌 “Nano Banana“ 深度解析:AI 图像的未来是精准编辑,而非从零生成
  • 构建现代化的“历史上的今天“网站:从API到精美UI的全栈实践