[openrtm-users 00345] Re: OutPortのバッファリングについて
Ando Noriaki
n-ando @ aist.go.jp
2008年 1月 30日 (水) 00:18:27 JST
宇田様
安藤です
いつもお世話になっております。
> OpenRTM-aist-0.4.1のOutPortのバッファリングについてご教授下さい。
>
> OutPortにおいて、ブロックモードでのデータ書き込みを行いたいのですが、
> OutPort.hを拝見しますと、write()メソッドの中で
>
> virtual bool write(const DataType& value)
> {
> ...
> while (m_writeBlock && this->isFull())
> {
> /* フル状態解消待ち */
> }
> ...
> }
>
> のようにバッファフルの解消待ちをされているものの、RingBuffer.h では
> isFull()が常にfalseを返すように見受けられるのですが、0.4.1 ではまだ
> ブロックモードには対応されていないのでしょうか?
RingBuffer.hで定義されているバッファはフル状態にならないバッファですので、
ブロッキングをONに設定してもブロッキングされません。
OutPort(とInPort)はテンプレートの引数として、バッファを取ることができ、
これにより、コンポーネント開発者は独自の機能を持つバッファを
OutPortもしくはInPortで使用することができるようになっています。
ですので、BufferBaseを継承した独自のバッファがisFullでtrueを返す場合
一応ブロッキングされるはずです。
ただ、この機能はまだ十分にデバッグされておらず、
有効に機能するかどうかはこちらではちょっとわかりません。
> またバッファクリアを行いたいのですが、この場合は setReadBlock()で非
> ブロックモードを指定した後、read() を false が返るまで繰り返せばよろ
> しいでしょうか?(m_readTimeout はデフォルト値 0 を想定しています)
現在のRingBufferでは、常に最新値を読むので、
ご希望のバッファクリアに相当する動作はおそらくしないものと思われます。
大変申し訳ないのですが、InPortおよびOutPortの特にバッファ周りは、
いま一つ完成度が低く、次のバージョンでは構造的に大幅に見直す可能性があります。
問題の一つとして、0.2.0では一つのOutPortから複数のInPortに
つないだ場合、すべてにデータが送信されるのに対して、0.4.0では
SubscriptionTypeの組合せによっては、うまくすべてにデータが
送信されないなど、バッファ周りの設計の不備による問題点が明らかになっております。
次期バージョンでは、このあたりの問題をきちんと解決したいと考えております。
何か、ご意見やアイディアなどございましたら、お教えいただけないでしょうか。
よろしくお願いいたします。
>
> zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
> z 宇田 安規男 z
> z NECシステムテクノロジー株式会社 システムテクノロジーラボラトリ z
> z 神奈川県川崎市中原区下沼部 1753 NEC 玉川事業場 N棟30F z
> z 〒 211-8666 Tel: 044-431-7574 Fax: 044-431-7588 z
> z E-mail: uda-axa @ necst.nec.co.jp z
> zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
>
>
>
--
安藤慶昭@独立行政法人産業技術総合研究所 研究員
知能システム研究部門 タスクインテリジェンス研究グループ
〒305-8568 茨城県つくば市梅園1-1-1 中央第2
TEL: 029-861-5981 FAX: 029-861-5971
n-ando @ aist.go.jp, n-ando @ ieee.org
openrtm-users メーリングリストの案内