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,以便外部调用者可以获取到发布者的具体实现对象。之后便将其返回了.