データポートによる通信(pull型通信)


ここでは出力ポートを持つコンポーネントと,入力ポートを持つコンポーネントの通信を行ってみます.
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のオーバーヘッドが高くなります.これを回避する方法は今のところありません.