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

来源:互联网 发布:数据安全管理规定 编辑:程序博客网 时间:2024/04/24 10:49

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 线程上



原创粉丝点击