ここでは出力ポートを持つコンポーネントと,入力ポートを持つコンポーネントの通信を行ってみます.
pull型通信に対応した場合は,InPortのisNewが利きません.そこで,In側ではreadを呼んで返り値を確認します.
それ以外の部分は全く同じです.
結局,pull型通信とpush型通信は何が違うの?
入力ポートを持つコンポーネント
CPPファイルの編集
onExecute関数を編集します.InPort変数として宣言されているm_inInについて読み込みを行い,読み込んだデータを取り出し表示を行います.返り値はbool型で,trueで成功,falseで失敗(接続なし)です.
return RTC::RTC_OK; } */ RTC::ReturnCode_t ConsoleOut::onExecute(RTC::UniqueId ec_id) { if ( m_inIn.read() ) { std::cout << "Data is " << m_in.data << std::endl; } else { std::cout << "No Connection." << std::endl; } return RTC::RTC_OK; } /* RTC::ReturnCode_t ConsoleOut::onAborting(RTC::UniqueId ec_id) {
Under Construction…
Under Construction…
まとめ
いかがですか?これでコンポーネント同士のプログラム接続が可能になりました.
ようやくRTCの存在価値に近づいてきた気がしませんか?
コラム
結局,pullとpushは何が違うの?
結局,pushとpullの違いは,どちらにデータバッファがあるかどうかです.
push型接続の場合,接続が確立された時点で,InPort側のバッファがアクティブになります.OutPort側でwriteをした場合,subscription_typeによって,データの送信タイミングが変わります.(push接続のsubscription_typeについて)
一方で,pull型ではOutPort側にバッファがあります.InPortでreadを呼ぶと,CORBAオブジェクトを使ったデータのやり取りが行われます.
結局,これで変わるのは,OutPort::writeと,InPort::readのオーバーヘッドの違いです.
push型では,OutPort::writeのオーバーヘッドが高くなります.ただし,subscription_typeによっては,writeメソッドでブロックされることを回避できます.
一方でpull型では,InPort::readのオーバーヘッドが高くなります.これを回避する方法は今のところありません.