OpenDDS开发手册---第二章(开始)3

22 篇文章 3 订阅

2.1.4 设置订阅服务器

   大部分订户的代码是相同的或与我们刚刚完成探索的发布者类似, 我们将迅速通过类似的部分进展, 并请您到讨论以上详细信息。此示例订阅服务器的完整源代码在
Subscriber.cpp 和 DataReaderListener.cpp 文件$DDS_ROOT/DevGuideExamples/DCPS/Messenger/.


2.1.4.1 初始化参与者

    在初始化服务时, 订阅服务器的开始与发布服务器相同,加入我们的域:
int main (int argc, char *argv[])
{
try {
DDS::DomainParticipantFactory_var dpf =
TheParticipantFactoryWithArgs(argc, argv);
DDS::DomainParticipant_var participant =
dpf->create_participant(42, // Domain ID
PARTICIPANT_QOS_DEFAULT,
0, // No listener required
OpenDDS::DCPS::DEFAULT_STATUS_MASK);
if (!participant) {
std::cerr << "create_participant failed." << std::endl;
return 1 ;
}

2.1.4.2 注册数据类型与创建主题

    接下来, 我们初始化消息类型和主题。请注意, 如果主题已经在该域中初始化, 具有相同的数据类型和兼容的 qos, create_topic ()
调用返回与现有主题相对应的引用。如果类型或 qos在我们的 create_topic () 调用中指定不匹配现有主题的调用失败。还有一个 find_topic () 操作, 我们的订户可以使用简单
检索现有主题。
Messenger::MessageTypeSupport_var mts =
new Messenger::MessageTypeSupportImpl();
if (DDS::RETCODE_OK != mts->register_type(participant, "")) {
std::cerr << "Failed to register the MessageTypeSupport." << std::endl;
return 1;
}
CORBA::String_var type_name = mts->get_type_name ();
DDS::Topic_var topic =
participant->create_topic("Movie Discussion List",
type_name,
TOPIC_QOS_DEFAULT,
0, // No listener required
OpenDDS::DCPS::DEFAULT_STATUS_MASK);
if (!topic) {
std::cerr << "Failed to create_topic." << std::endl;
return 1;
}

2.1.4.3 创建一个订阅

接下来, 我们创建具有默认 qos 的订阅者
// Create the subscriber
DDS::Subscriber_var sub =
participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT,
0, // No listener required
OpenDDS::DCPS::DEFAULT_STATUS_MASK);
if (!sub) {
std::cerr << "Failed to create_subscriber." << std::endl;
return 1;
}

2.1.4.4 创建数据读取者和监听

    我们需要将一个侦听器对象与我们创建的数据读取者相关联, 这样我们就可以使用它来检测数据何时可用。下面的代码构造侦听器对象。DataReaderListenerImpl 类显示在下一小节中。

DDS::DataReaderListener_var listener(new DataReaderListenerImpl);

    侦听器在堆上分配并分配给一个 DataReaderListener_var 对象。这类型提供引用计数行为, 以便当侦听器最后一个对它的引用被删除。此用法在 opendds 的堆分配中是典型的应用程序代码并释放应用程序开发人员, 使其不必主动管理已分配对象的寿命。
    现在, 我们可以创建数据读取器, 并将它与我们的主题, 默认 qos属性和我们刚创建的侦听器对象。
// Create the Datareader
DDS::DataReader_var dr =
sub->create_datareader(topic,
DATAREADER_QOS_DEFAULT,
listener,
OpenDDS::DCPS::DEFAULT_STATUS_MASK);
if (!dr) {
std::cerr << "create_datareader failed." << std::endl;
return 1;
}
    此线程现在可以自由执行其他应用程序工作。我们的侦听器对象将被调用当示例可用时, 在 OpenDDS 线程上



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道格拉斯范朋克

播种花生牛奶自留田

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值