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

Hiroyuki Chishiro chishiro @ rt.k2.keio.ac.jp
2007年 12月 3日 (月) 14:51:30 JST


安藤様

慶応義塾大学の千代です。

いつもお世話になっております。

質問への返答やサンプルを作成していただき、ありがとうございます。

サンプルを読んで動かすことで、どのようにサービスポートで
非同期で関数呼出しをするかを理解できました。
しかし、他の部分でいくつか質問があります。

このサンプルを例にすると、do関数でそのサービスポートを所有している
オブジェクトのメンバ変数を操作することはできるのでしょうか。

また、do関数からシグナルを送信する等をすることで、
実行中のコンテキストをreturn文を待たずに状態遷移
(Ex. onExecute -> onAbort)させるか、
もしくは例外を発生させることはできるのでしょうか。

つまり、do関数が呼び出されたら、実行中のコンテキストに
イベントを送ることで、決められた操作を即座に実行する。
その後に元のイベントを受け取る前の動作に戻る、もしくは他の状態に
遷移したいと考えています。

よろしくお願いします。


  "Ando Noriaki" <n-ando @ aist.go.jp> wrote:
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
> 千代様
> 
> 産総研 安藤です
> 
> ためしに、サンプルを作成してみましたのでお送りいたします。
> 
> MyServiceProviderCompとMyServiceConsumerCompを起動して、
> ポート同士を接続して、その後両者をActivateしてください。
> 
> MyServiceConsumerCompの方で、
> do? (push any key and enter)
> と出ますので、適当な文字とenterを押してください。
> Provider側への呼び出しはすぐにもどって、MyServiceProviderCompの方では、
> 1秒間隔で、
> 
> processing
> 
> と10回出ます。
> その後、MyServiceProviderCompの方でdoneと表示されると同時に、
> MyServiceConsumerCompの方でもdoneと表示されます。
> 
> 参考にしてみてください。
> 
> 07/12/01 に Ando Noriaki<n-ando @ aist.go.jp> さんは書きました:
> > 千代様
> >
> > 産総研 安藤です
> >
> > > 慶応義塾大学の千代と申します。
> > >
> > > 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
> >
> 
> 
> -- 
> 安藤慶昭@独立行政法人産業技術総合研究所 研究員
>                    知能システム研究部門 タスクインテリジェンス研究グループ
>                    〒305-8568 茨城県つくば市梅園1-1-1 中央第2
>                    TEL: 029-861-5981 FAX: 029-861-5971
>                    n-ando @ aist.go.jp, n-ando @ ieee.org

---------------------------------------------------
Hiroyuki Chishiro <chishiro @ ny.ics.keio.ac.jp>
Keio University
---------------------------------------------------



openrtm-users メーリングリストの案内