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

【FastDDS】Layer DDS之Domain ( 04-DomainParticipantFactory)

Fast DDS 域参与者工厂(DomainParticipantFactory)详解

一、域参与者工厂(DomainParticipantFactory)基础定义

域参与者工厂(DomainParticipantFactory)的唯一作用是实现域参与者(DomainParticipant)对象的创建与销毁。该类自身不存在工厂类,而是以单例(singleton)对象的形式存在,可通过 DomainParticipantFactory 类的静态成员函数 get_instance() 来获取其实例。

DomainParticipantFactory 的行为可通过 DomainParticipantFactoryQos(域参与者工厂服务质量)中指定的 QoS 值进行修改。由于 DomainParticipantFactory 是单例对象,其 QoS 只能通过 DomainParticipantFactory::set_qos() 成员函数进行调整。

需要注意的是,DomainParticipantFactory 并非实体(Entity),因此不支持关联任何监听器(Listener)。

二、域参与者工厂服务质量(DomainParticipantFactoryQos)

DomainParticipantFactoryQos 用于控制 DomainParticipantFactory 的行为,其内部包含以下 QosPolicy(服务质量策略)对象,各策略的访问器/修改器及可变性信息如下表所示:

QosPolicy(服务质量策略)类访问器/修改器(Accessor/Mutator)可变性(Mutable)
EntityFactoryQosPolicy(实体工厂服务质量策略)entity_factory()是(Yes)
ThreadSettings(线程设置)shm_watchdog_thread()否(No)
ThreadSettings(线程设置)file_watch_threads()否(No)

(一)QoS 修改规则与作用

由于 DomainParticipantFactory 是单例对象,其 QoS 仅能通过 DomainParticipantFactory::set_qos() 成员函数修改。其中,EntityFactoryQosPolicy 策略中的 autoenable_created_entities(自动启用创建的实体)参数尤为关键——该参数直接决定了通过 DomainParticipantFactory 创建的 DomainParticipant 是否在创建后自动启用:

  • autoenable_created_entities = true 时,新创建的 DomainParticipant 会自动启用,无需额外调用启用函数。
  • autoenable_created_entities = false 时,新创建的 DomainParticipant 处于禁用状态,需手动调用启用函数才能正常工作。

(二)DomainParticipantFactoryQos 操作示例代码

以下代码展示了如何修改 DomainParticipantFactory 的 QoS,并基于不同 QoS 配置创建 DomainParticipant

DomainParticipantFactoryQos qos;// 1. 将autoenable_created_entities设为true:创建的DomainParticipant会自动启用
qos.entity_factory().autoenable_created_entities = true;
if (DomainParticipantFactory::get_instance()->set_qos(qos) != RETCODE_OK)
{// 错误处理return;
}// 基于上述QoS创建DomainParticipant(返回的域参与者已自动启用)
DomainParticipant* enabled_participant =DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT);
if (nullptr == enabled_participant)
{// 错误处理return;
}// 2. 将autoenable_created_entities设为false:创建的DomainParticipant会处于禁用状态
qos.entity_factory().autoenable_created_entities = false;
if (DomainParticipantFactory::get_instance()->set_qos(qos) != RETCODE_OK)
{// 错误处理return;
}// 基于上述QoS创建DomainParticipant(返回的域参与者需手动启用)
DomainParticipant* disabled_participant =DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT);
if (nullptr == disabled_participant)
{// 错误处理return;
}

三、从 XML 文件加载配置文件(Loading Profiles from an XML File)

若需基于 XML 配置文件(Profiles)创建实体(Entities),需先加载包含这些配置文件的 XML 文件。具体规则与操作流程如下:

(一)配置文件加载规则

  1. 自动加载:若配置文件定义在默认加载的文件中(如 Fast DDS 预设的配置文件),则在系统初始化时会自动加载,无需额外操作。
  2. 手动加载:若配置文件位于非默认文件中,需调用 load_XML_profiles_file() 成员函数手动加载 XML 文件中的配置。关于 XML 配置文件的格式规范及自动加载机制,可参考“XML Profiles”(XML 配置文件)章节。

(二)加载 XML 配置文件并创建实体的示例代码

以下代码展示了如何手动加载 XML 配置文件,并使用其中的配置创建 DomainParticipant

// 加载包含配置文件的XML文件(文件名为"profiles.xml")
DomainParticipantFactory::get_instance()->load_XML_profiles_file("profiles.xml");// 基于XML中定义的配置文件(名为"participant_profile")创建DomainParticipant
DomainParticipant* participant_with_profile =DomainParticipantFactory::get_instance()->create_participant_with_profile(0, "participant_profile");
if (nullptr == participant_with_profile)
{// 错误处理return;
}

通过上述操作,创建的 DomainParticipant 会自动应用 XML 配置文件中“participant_profile”配置项定义的 QoS settings,无需在代码中逐一设置,大幅提升了配置的灵活性与可维护性。

http://www.dtcms.com/a/365980.html

相关文章:

  • 专项智能练习(Photoshop软件基础)
  • 智能高效内存分配器测试报告
  • 【CMake】message函数
  • C++对象构造与析构
  • numpy meshgrid 转换成pygimli规则网格
  • cppreference_docs
  • 稳居全球TOP3:鹏辉能源“3+N” 布局,100Ah/50Ah等户储电芯产品筑牢市场优势
  • 【C++】Vector核心实现:类设计到迭代器陷阱
  • MySQL:表的约束上
  • C# 代码中的“熵增”概念
  • 单片机:GPIO、按键、中断、定时器、蜂鸣器
  • 《单链表经典问题全解析:5 大核心题型(移除元素 / 反转 / 找中点 / 合并 / 回文判断)实现与详解》
  • 【面试题】词汇表大小如何选择?
  • PS大神级AI建模技巧!效率翻倍工作流,悄悄收藏!
  • 本地化AI问答:告别云端依赖,用ChromaDB + HuggingFace Transformers 搭建离线RAG检索系统
  • OpenCV的阈值处理
  • ChartView的基本介绍与使用
  • shell编程从0基础--进阶 1
  • 如何高效记单词之:抓住首字母——以find、fund、fond、font为例
  • Linux `epoll` 机制的入口——`epoll_create`函数
  • Java并发编程中的CountDownLatch与CompletableFuture:同步与异步的完美搭档
  • 驱动增长的双引擎:付费搜索与自然搜索的终极平衡策略
  • Loot模板系统
  • helm应该安装在哪些节点
  • ABAQUS多尺度纤维增强混凝土二维建模
  • 微信小程序-day3
  • 【mac】macOS上的实用Log用法
  • 使用Navicat去批量传输数据库的表结构
  • fastlio配置与过程中遇到的问题
  • 51单片机----LED与数码管模块