[openrtm-users 00294] Re: サービスポートで非同期呼出し

Ando Noriaki n-ando @ aist.go.jp
2007年 12月 1日 (土) 22:49:17 JST


千代様

産総研 安藤です

> 慶応義塾大学の千代と申します。
>
> Service Portを用いて非同期でリモートオブジェクトの呼出しを
> したいと考えています。
>
> 具体的には、Service Portから非同期でリモートオブジェクトの関数を
> 呼出して、その処理が終わったらイベントをPushする。
>
> 呼出元がイベントを受け取ったら、呼出元のオブジェクトで
> あらかじめ登録しておいたイベントハンドラの関数を
> 実行するというような手順を考えています。
>
> 戻り値の書き込みはデータポートのようにコールバックオブジェクトで
> OnWriteConvert関数を利用するような形で実装することを考えています。
>
> Service Portで非同期呼出しをするにはどのように実装すれば
> よいのでしょうか。

現在のOpenRTMではそのようなことを行う標準的な方法はありません。
しかしながら、サービスポートをうまく使えば、おっしゃるようなことは実現可能です。
まず、前提として、一つのポートにはプロバイダインターフェースとコンシューマ
インターフェースを任意の数だけ持たせることが可能です。

あるサービスポートののプロバイダ側で、

interface MyService
{
  oneway void do();
};

という、サービスプロバイダを持たせ、かつ同じポートに、

interface Callback
{
  void done();
};

のような、コンシューマを持たせます。

サービスコンシューマの方は、これと逆にプロバイダとコンシューマを持たせます。
つまり、
- MyService のコンシューマ
- Callbackのプロバイダ
を持つことになります。
これらのプロバイダとコンシューマはポートを接続することにより相互に接続されます。

MyServiceのプロバイダ側では、do()の処理が終わったら、
そのコンシューマのdone()を呼んでやることで、呼び出し側に
処理が終わったことを知らせることが可能です。

このような方法でどうでしょうか?
-- 
安藤慶昭@独立行政法人産業技術総合研究所 研究員
                   知能システム研究部門 タスクインテリジェンス研究グループ
                   〒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 メーリングリストの案内