RTI Connext .NET API (legacy)  Version 6.1.2
HelloWorld_subscriber.cpp

RTI Connext Subscription Example

The unmodified subscription example generated by rtiddsgen.

HelloWorld_subscriber.cpp

/*
* (c) Copyright, Real-Time Innovations, 2012. All rights reserved.
* RTI grants Licensee a license to use, modify, compile, and create derivative
* works of the software solely for use with RTI Connext DDS. Licensee may
* redistribute copies of the software provided that all such copies are subject
* to this license. The software is provided "as is", with no warranty of any
* type, including any warranty for fitness for any purpose. RTI is under no
* obligation to maintain or support the software. RTI shall not be liable for
* any incidental or consequential damages arising out of the use or inability
* to use the software.
*/
/* HelloWorld_subscriber.cpp
A subscription example
This file is derived from code automatically generated by the rtiddsgen
command:
rtiddsgen -language C++/CLI -example <arch> HelloWorld.idl
Example subscription of type HelloWorld automatically generated by
'rtiddsgen'. To test it, follow these steps:
(1) Compile this file and the example publication.
(2) Start the subscription
(3) Start the publication
(4) [Optional] Specify the list of discovery initial peers and
multicast receive addresses via an environment variable or a file
(in the current working directory) called NDDS_DISCOVERY_PEERS.
You can run any number of publisher and subscriber programs, and can
add and remove them dynamically from the domain.
*/
#ifndef IMPORT_HelloWorld
/* If this example code is packaged into an assembly other than that
* containing the generated types themselves, no header inclusion is
* necessary. In that case, simply define IMPORT_HelloWorld.
*/
#include "HelloWorldSupport.h"
#endif
using namespace System;
public ref class HelloWorldSubscriber {
public:
static void subscribe(int domain_id, int sample_count);
private:
static void shutdown(
DDS::DomainParticipant^ participant);
};
public ref class HelloWorldListener : public DDS::DataReaderListener {
public:
virtual void on_requested_deadline_missed(
DDS::DataReader^ /*reader*/,
DDS::RequestedDeadlineMissedStatus% /*status*/) override {}
virtual void on_requested_incompatible_qos(
DDS::DataReader^ /*reader*/,
DDS::RequestedIncompatibleQosStatus^ /*status*/) override {}
virtual void on_sample_rejected(
DDS::DataReader^ /*reader*/,
DDS::SampleRejectedStatus% /*status*/) override {}
virtual void on_liveliness_changed(
DDS::DataReader^ /*reader*/,
DDS::LivelinessChangedStatus% /*status*/) override {}
virtual void on_sample_lost(
DDS::DataReader^ /*reader*/,
DDS::SampleLostStatus% /*status*/) override {}
virtual void on_subscription_matched(
DDS::DataReader^ /*reader*/,
DDS::SubscriptionMatchedStatus% /*status*/) override {}
virtual void on_data_available(DDS::DataReader^ reader) override;
HelloWorldListener() {
data_seq = gcnew HelloWorldSeq();
info_seq = gcnew DDS::SampleInfoSeq();
}
private:
HelloWorldSeq^ data_seq;
DDS::SampleInfoSeq^ info_seq;
};
int main(array<System::String^>^ argv) {
int domain_id = 0;
if (argv->Length >= 1) {
domain_id = Int32::Parse(argv[0]);
}
int sample_count = 0; /* infinite loop */
if (argv->Length >= 2) {
sample_count = Int32::Parse(argv[1]);
}
/* Uncomment this to turn on additional logging
NDDS::ConfigLogger::get_instance()->set_verbosity_by_category(
NDDS::LogCategory::NDDS_CONFIG_LOG_CATEGORY_API,
NDDS::LogVerbosity::NDDS_CONFIG_LOG_VERBOSITY_STATUS_ALL);
*/
try {
HelloWorldSubscriber::subscribe(
domain_id, sample_count);
}
catch(DDS::Exception^) {
return -1;
}
return 0;
}
void HelloWorldSubscriber::subscribe(
int domain_id, int sample_count) {
/* To customize participant QoS, use
the configuration file USER_QOS_PROFILES.xml */
DDS::DomainParticipant^ participant =
domain_id,
nullptr /* listener */,
if (participant == nullptr) {
shutdown(participant);
throw gcnew ApplicationException("create_participant error");
}
/* To customize subscriber QoS, use
the configuration file USER_QOS_PROFILES.xml */
DDS::Subscriber^ subscriber = participant->create_subscriber(
nullptr /* listener */,
if (subscriber == nullptr) {
shutdown(participant);
throw gcnew ApplicationException("create_subscriber error");
}
/* Register the type before creating the topic */
System::String^ type_name = HelloWorldTypeSupport::get_type_name();
try {
HelloWorldTypeSupport::register_type(
participant, type_name);
} catch (DDS::Exception^ e) {
shutdown(participant);
throw e;
}
/* To customize topic QoS, use
the configuration file USER_QOS_PROFILES.xml */
DDS::Topic^ topic = participant->create_topic(
"Example HelloWorld",
type_name,
nullptr /* listener */,
if (topic == nullptr) {
shutdown(participant);
throw gcnew ApplicationException("create_topic error");
}
/* Create a data reader listener */
HelloWorldListener^ reader_listener =
gcnew HelloWorldListener();
/* To customize the data reader QoS, use
the configuration file USER_QOS_PROFILES.xml */
DDS::DataReader^ reader = subscriber->create_datareader(
topic,
reader_listener,
if (reader == nullptr) {
shutdown(participant);
throw gcnew ApplicationException("create_datareader error");
}
/* Main loop */
const System::Int32 receive_period = 4000; // milliseconds
for (int count=0; (sample_count == 0) || (count < sample_count); ++count) {
Console::WriteLine(
"HelloWorld subscriber sleeping for {0} sec...",
receive_period / 1000);
System::Threading::Thread::Sleep(receive_period);
}
/* Delete all entities */
shutdown(participant);
}
/* Delete all entities */
void HelloWorldSubscriber::shutdown(
DDS::DomainParticipant^ participant) {
if (participant != nullptr) {
participant->delete_contained_entities();
participant);
}
/* RTI Connext provides finalize_instance() method on
domain participant factory for users who want to release memory used
by the participant factory. Uncomment the following block of code for
clean destruction of the singleton. */
/*
DDS::DomainParticipantFactory::finalize_instance();
*/
}
void HelloWorldListener::on_data_available(DDS::DataReader^ reader) {
HelloWorldDataReader^ HelloWorld_reader =
safe_cast<HelloWorldDataReader^>(reader);
try {
HelloWorld_reader->take(
data_seq,
info_seq,
}
return;
}
catch(DDS::Exception ^e) {
Console::WriteLine("take error {0}", e);
return;
}
System::Int32 data_length = data_seq->length;
for (int i = 0; i < data_length; ++i) {
if (info_seq->get_at(i)->valid_data) {
HelloWorldTypeSupport::print_data(data_seq->get_at(i));
}
}
try {
HelloWorld_reader->return_loan(data_seq, info_seq);
}
catch(DDS::Exception ^e) {
Console::WriteLine("return loan error {0}", e);
}
}