2017-09-11 13 views
2

私の練習では、OpenDDSというIDL構造から複数のトピックを作成したいと思いますか?さもなければ私にそれをする方法を知らせてください。OpenDDS - 単一のIDL構造から複数のトピックを作成する

私は以下のようにしています。正しい方法でない場合は、私に修正してください。私が使用 サンプルは、次のようにIDLは、あなたがAから望むようにあなたができるだけ多くのトピックを作成することができます

StockQuoter.idl 
--------------- 
module StockQuoter 
{ 
#pragma DCPS_DATA_TYPE "StockQuoter::Quote" 
#pragma DCPS_DATA_KEY "StockQuoter::Quote ticker" 

    struct Quote { 
    string ticker; 
    string exchange; 
    string full_name; 
    double value; 
    string data; 
    TimeBase::TimeT timestamp; 
    }; 
} 

publisher.cpp


// Create TOPICS and TYPES Vector 
    std::stringstream ss; 
    for(unsigned int idx = 0; idx < 100; ++idx) 
    { 
     ss << (idx+1); 
     TOPICS.push_back("TOPIC" + std::string(ss.str())); 
     TYPES.push_back("TYPE" + std::string(ss.str())); 
     ss.clear(); 
     ss.str(std::string()); 
    } 

    // Register 
    for(unsigned int idx = 0; idx < 100; ++idx) 
    { 
     vec_quote_servent.push_back(new StockQuoter::QuoteTypeSupportImpl()); 
     if (DDS::RETCODE_OK != vec_quote_servent[idx]->register_type(participant.in(), TYPES[idx].c_str())) 
     { 
      cerr << "register_type for " << TYPES[idx] << " failed." << endl; 
      ACE_OS::exit(1); 
     } 
    } 

    // Create a topics 
    for(unsigned int idx = 0; idx < 100; ++idx) 
    { 
     vec_quote_topic.push_back( participant->create_topic (TOPICS[idx].c_str(), 
             TYPES[idx].c_str(), 
             default_topic_qos, 
             DDS::TopicListener::_nil(), 
             ::OpenDDS::DCPS::DEFAULT_STATUS_MASK)); 

     if (CORBA::is_nil (vec_quote_topic[idx].in())) { 
      cerr << "create_topic for " << TOPICS[idx] << " failed." << endl; 
      ACE_OS::exit(1); 
     } 
    } 

    // Create DataWriters 
    for(unsigned int idx = 0; idx < 100; ++idx) 
    { 
     vec_quote_base_dw.push_back(pub->create_datawriter(vec_quote_topic[idx].in(), 
             dw_default_qos, 
             DDS::DataWriterListener::_nil(), 
             ::OpenDDS::DCPS::DEFAULT_STATUS_MASK)); 

     if (CORBA::is_nil (vec_quote_base_dw[idx].in())) { 
      cerr << "create_datawriter for " << TOPICS[idx] << " failed." << endl; 
      ACE_OS::exit(1); 
     } 

     vec_quote_dw.push_back(StockQuoter::QuoteDataWriter::_narrow(vec_quote_base_dw[idx].in())); 
     if (CORBA::is_nil (vec_quote_dw[idx].in())) { 
      cerr << TOPICS[idx] << " could not be narrowed"<< endl; 
      ACE_OS::exit(1); 
     } 
    } 

    // Create handle 
    for(unsigned int idx = 0; idx < 100 ; ++idx) 
    { 
     { 
      StockQuoter::Quote topic2; 
      topic2.ticker = CORBA::string_dup(TOPICS[idx].c_str()); 
      vec_topic_handle.push_back(vec_quote_dw[idx]->register_instance(topic2)); 
     } 
    } 

     // Publish data 
     StockQuoter::Quote vec_quote; 
     vec_quote.exchange = STOCK_EXCHANGE_NAME; 
     vec_quote.ticker = CORBA::string_dup("VEC_TOPIC"); 
     vec_quote.full_name = CORBA::string_dup("TOPIC Receipts"); 
     vec_quote.value = 1600.0 + 10.0*i; 
     vec_quote.timestamp = get_timestamp(); 

     for(unsigned int idx = 0; idx < 100; ++idx) 
     { 
      vec_quote.value += idx + 10; 
      cout << "Publishing " << TOPICS[idx] << " : " << vec_quote.value <<endl; 
      ret = vec_quote_dw[idx]->write(vec_quote, vec_topic_handle[idx]); 
      if (ret != DDS::RETCODE_OK) { 
      ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: TOPIC2 write returned %d.\n"), ret)); 
      } 
     } 

答えて

0

、あるOpenDDS-3.12/examples/DCPS/IntroductionToOpenDDS

でご利用いただけます単一のIDLファイル。

participant->create_topic (TOPICS[idx].c_str(), 
          TYPES[idx].c_str(), 
          default_topic_qos, 
          DDS::TopicListener::_nil(), 
          ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); 

ただし、作成した各トピックのタイプは同じです。あなたがする必要がある場合は、トピックのための異なるタイプを作成することもできます。

+0

いくつかのライトを消していただきありがとうございます。同じコードのいくつかの例では、「あなたがしなければならない場合には、異なるタイプのトピックを作成することができます」という点を実証することができます。 – Panch

+0

私は短い間に(私は560以上の文字が必要なので)別の答えを投稿します。 – Pete

1

今、私はあなたが尋ねたかった点を得る。 1つのトピックにつき1つのファイルで、または1つのファイル内ですべて異なるトピックタイプを定義することができます。 IDLファイルに複数のトピックタイプを定義すると、ファイルごとにタイプサポートが生成されます。同じ例を使って、これをより正確に説明しましょう。次のようにIntroductionToOpenDDS例えばIDLファイルが見えます:

#include "orbsvcs/TimeBase.idl" 

module StockQuoter 
{ 
#pragma DCPS_DATA_TYPE "StockQuoter::Quote" 
#pragma DCPS_DATA_KEY "StockQuoter::Quote ticker" 

struct Quote { 
    string ticker; 
    string exchange; 
    string full_name; 
    double value; 
    TimeBase::TimeT timestamp; 
}; 

#pragma DCPS_DATA_TYPE "StockQuoter::ExchangeEvent" 
#pragma DCPS_DATA_KEY "StockQuoter::ExchangeEvent exchange" 

enum ExchangeEventType { TRADING_OPENED, 
         TRADING_CLOSED, 
         TRADING_SUSPENDED, 
         TRADING_RESUMED }; 
struct ExchangeEvent { 
    string exchange; 
    ExchangeEventType event; 
    TimeBase::TimeT timestamp; 
}; 
}; 

あなたが見ることができるように、2つのタイプが定義されています:QuoteExchangeEvent。このIDLファイルがコンパイルされると、QuoteExchangeEventの両方のサポートが生成されます。あなたは既にこの行(QuoteTypeSupportImpl)を使用するタイプのサポートを使用 :

vec_quote_servent.push_back(new StockQuoter::QuoteTypeSupportImpl()); 

同じタイプのサポートはExchangeEventのために生成され、あなたはタイプのサポートはStockQuoter::ExchangeEventTypeSupportImpl()方法でStockQuoter::ExchangeEventと呼ばれるでしょう。これを使用して、タイプExchangeEventのトピックを作成するだけです。

こちらがお役に立てば幸いです。詳細が必要な場合は、お気軽にお問い合わせください。

+1

私は今これを理解してくれてありがとうと感謝しています。 – Panch

関連する問題