1. 程式人生 > >OpenDDS開發手冊---第二章(開始)3

OpenDDS開發手冊---第二章(開始)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 執行緒上