[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 メーリングリストの案内