[openrtm-staff:1238] Re: オブザーバの使用方法について

Ando Noriaki n-ando @ aist.go.jp
2017年 11月 21日 (火) 07:53:30 JST


坂本様

安藤です

すみません、narrow しないとダメでした。

OpenRTM::ComponentObserver_var _provider = mgr_.getPOA()->id_to_
reference(oid_.in());
ではなく、
CORBA::Object_var obj = mgr_.getPOA()->id_to_reference(oid_.in());
OpenRTM::ComponentObserver_var _provider =
OpenRTM::ComponentObserver::_narrow(obj);
のように、CORBA::Object 型から特定の方にnarrowが必要です。

この辺のコードは ManagerServant.cpp などにも同じものがありますので参考にしてください。


2017年11月21日 2:30 Sakamoto Takeshi <sakamoto @ globalassist.co.jp>:

> 安藤 様
>
>
> いつもお世話になっております.
> グローバルアシストの坂本です.
>
> 本当に何度も申し訳ございませんが,
> オブザーバの件につきまして,再度,お教えください.
>
> 前回のアドバイスを基に,以下のような修正を行いました.
>
> > CORBAオブジェクトにする必要があるので、スケルトンとServantBaseを継承する必要がありますね。
> こちらのお話を基に,以下のように修正いたしました.
> class ComponentObserverImpl
> : public virtual PortableServer::ServantBase,
> public virtual POA_OpenRTM::ComponentObserver {
> public:
> void update_status(::OpenRTM::StatusKind status_kind, const char* hint);
> };
>
> > servant_ = new ComponentObserverImpl();
> > RTM::Manager& mgr_ = RTM::Manager::instance();
> > CORBA::ObjectId_var oid_ = mgr_.getPOA()->servant_to_id(servant_);
> > OpenRTM::ComponentObserver_var _provider = mgr_.getPOA()->id_to_
> reference(oid_.in());
> > だいたいこんな感じです。細かい文法は間違っているかもしれません。
> こちらにつきましては,ほぼそのまま使わせて頂いたのですが,
> 最後の行で以下のようなエラーが出てしまい,コンパイルできませんでした.
> 'CORBA::Object_ptr' から
> '_CORBA_ObjRef_Var<OpenRTM::_objref_ComponentObserver,
> OpenRTM::ComponentObserver_Helper>' に
> 変換できません
>
> そこで,
> OpenRTM::ComponentObserver_var provider = OpenRTM::ComponentObserver::_
> narrow(mgr_.getPOA()->id_to_reference(oid.in()));
> と無理矢理キャストをしてみたのですが,こちらはコンパイルは通るようになったのですが,
> 実行時エラーで落ちてしまいました.
>
> 何度も申し訳ございませんが
> OpenRTM::ComponentObserver_var _provider = mgr_.getPOA()->id_to_
> reference(oid_.in());
> こちらの部分につきまして,再度,アドバイスを頂ければ幸いです.
>
> よろしくお願いいたします.
>
> > 安藤です
> >
> > グローバルアシストの坂本です.
> > >
> > > 何度も申し訳ございません.
> > > オブザーバの使用方法につきまして,再度,お教えください.
> > >
> > > 以前お教え頂きましたPytrhon版のサンプルで,以下のような処理がございますが,
> > > こちらをC++で書こうと思った場合,どのような記述となりますでしょうか?
> > > servant_ = ComponentObserver_i()
> > > mgr_ = OpenRTM_aist.Manager.instance()
> > > oid_ = mgr_.getPOA().servant_to_id(servant_)
> > > self._provider = mgr_.getPOA().id_to_reference(oid_)
> > >
> > >
> > servant_ = new ComponentObserverImpl();
> > RTM::Manager& mgr_ = RTM::Manager::instance();
> > CORBA::ObjectId_var oid_ = mgr_.getPOA()->servant_to_id(servant_);
> > OpenRTM::ComponentObserver_var _provider = mgr_.getPOA()->id_to_
> reference(
> > oid_.in());
> >
> > だいたいこんな感じです。細かい文法は間違っているかもしれません。
> >
> >
> > > また,ComponentObserver_iの定義として
> > > class ComponentObserver_i(OpenRTM__POA.ComponentObserver):
> > > となっておりますが,そもそもC++の場合に,
> > > class ComponentObserverImpl : public OpenRTM::ComponentObserver
> > > という定義にすること自体が間違っているのでしょうか?
> > >
> >
> > CORBAオブジェクトにする必要があるので、スケルトンとServantBaseを継承する必要がありますね。
> >
> > class ComponentObserverImpl
> >  public virtual PortableServer::ServantBase,
> >  public virtual POA_OpenRTM::ComponentObserver
> > {};
> > RTObject.h 等を参考にしてみてください。
> >
>
> -----------
> 株式会社 グローバルアシスト
> 坂本 武志
> sakamoto @ globalassist.co.jp
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.openrtm.org/pipermail/openrtm-staff/attachments/20171121/7a3e4c6d/attachment-0001.html>


More information about the openrtm-staff mailing list