Fastdds_ContentFilteredTopicExample_代码剖析5_create_publisher

        在注册完类型之后,我们就可以看见,域参与者对发布者进行创建了。

        

    publisher_ = participant_->create_publisher(PUBLISHER_QOS_DEFAULT, nullptr);
    if (nullptr == publisher_)
    {
        return false;
    }

        他首先进入了头文件中的这个函数

    Publisher* create_publisher(
            const PublisherQos& qos,
            PublisherListener* listener = nullptr,
            const StatusMask& mask = StatusMask::all());

        我们可以看到他需要传入3个参数,qos策略用于保证数据传输的要求得以满足,监听器用于返回发生的事件,mask用于表示发布者监听器所监听的状态掩码,用于指定监听哪些状态的变化。但实际上他只需要传入qos。我们可以看到他这里传入的是一个默认的QOS,然后域参与者将让实体去对发布者进行创建


Publisher* DomainParticipant::create_publisher(
        const PublisherQos& qos,
        PublisherListener* listener,
        const StatusMask& mask)
{
    return impl_->create_publisher(qos, listener, mask);
}

        之后他会转到域参与者实体的这个函数

  

    Publisher* create_publisher(
            const PublisherQos& qos,
            PublisherListener* listener,
            const StatusMask& mask)
    {
        return create_publisher(qos, nullptr, listener, mask);
    }

        他又重新传入了另一个creat,而下一个creat才是真正创建发布者的地方

        

    Publisher* create_publisher(
            const PublisherQos& qos,
            PublisherImpl** impl,
            PublisherListener* listener = nullptr,
            const StatusMask& mask = StatusMask::all())
    {
        PublisherImpl* pubimpl = create_publisher_impl(qos, listener);
        Publisher* pub = new Publisher(pubimpl, mask);
        pubimpl->user_publisher_ = pub;

        std::lock_guard<std::mutex> lock(mtx_pubs_);
        publishers_[pub] = pubimpl;
        pub->enable();

        if (impl)
        {
            *impl = pubimpl;
        }

        return pub;
    }

我们可以看到publisher同样有一个实体,如同域参与者一样。实体负责功能的具体实现。在创建完之后,将新创建的发布者对象 pub 存储到 publishers_ 中,以便后续可以根据发布者对象的名称快速找到对应的发布者实现对象。在之后将发布者启动。如果传入的参数 impl 不为空,则将 pubimpl 指针赋值给 impl,以便外部调用者可以获取到发布者的具体实现对象。之后便将其返回了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值