宇田様
安藤です
いつもお世話になっております。
> 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の組合せによっては、うまくすべてにデータが
送信されないなど、バッファ周りの設計の不備による問題点が明らかになっております。
次期バージョンでは、このあたりの問題をきちんと解決したいと考えております。
何か、ご意見やアイディアなどございましたら、お教えいただけないでしょうか。
よろしくお願いいたします。
いつも御世話になります。宇田@NECシステムテクノロジーです
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 ではまだ
ブロックモードには対応されていないのでしょうか?
またバッファクリアを行いたいのですが、この場合は setReadBlock()で非
ブロックモードを指定した後、read() を false が返るまで繰り返せばよろ
しいでしょうか?(m_readTimeout はデフォルト値 0 を想定しています)