岡田先生:産総研の原です。下記の振る舞いですが、CosNamingのresolveメソッドは、指定さえたネーミングコンテキストがあればそのreferenceを返しますが、存在しなければExceptionを発生させるようになっています。そのため、最初のやり方では、無限ループになってしまったのだと思います。一番最初のコードでncNameが存在しなえれば、やはり無限ループとなって抜け出せないというのが正常な動作だと思います。また、2番目のコードで、CosNamingを
RTC::CorbaNaming cn
= RTC::CorbaNaming(manager->getORB(), props["corba.nameservers"].c_str());
とされていますが、これでは、NameServiceのCORBAリファレンスが取得できていないとだと思います。#corba.nameserersがどうなっているか分かりませんので、判断に迷いますが、、、、NamingServiceのCORBAリファレンスを得るには、
CORBA::Object_var nS = orb->resolve_initial_references("NameService"); cxt = CosNaming::NamingContext::_narrow(nS);
でよいと思いますので、そのネーミングコンテキストに対して、resolveを実行すれば、CORBAの参照を取得するか、NotFoundのExceptionが発生すると思います。ちなみに、RT System Editorは、CosNamingExのCORBAリファレンスを取得して、listメソッドでNameServiceに登録されているCORBAリファレンスの一覧を取得しているようです。On 2011/07/09, at 15:59, Kei Okada wrote:
コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法をご存知の方がいらっしゃいましたら,方法をご教示いただけると幸いです.XXComp.cpp のなかで, CORBA::ORB_var orb; orb = CORBA::ORB_init(argc, argv); CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA"); PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj); PortableServer::POAManager_var manager = rootPOA -> the_POAManager(); CosNaming::NamingContext_var cxt; CORBA::Object_var nS = orb->resolve_initial_references("NameService"); cxt = CosNaming::NamingContext::_narrow(nS); CosNaming::Name ncName; ncName.length(1); ncName[0].id = CORBA::string_dup("ClockGenerator"); ncName[0].kind = CORBA::string_dup(""); CORBA::Object_var obj = NULL; do { try { obj = cxt->resolve(ncName); } catch(...) { std::cerr << "[" << argv[0] << "] wait ClockGenerator" << std::endl; sleep(3); } } while ( obj == NULL );とすると,所望の振る舞いをしてくれるのですが,コンポーネントの中のInit関数で以下のようにすると, void MySampleInit(RTC::Manager* manager) { { CORBA::ORB_var orb = manager->getORB(); CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA"); PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj); PortableServer::POAManager_var manager = rootPOA -> the_POAManager(); CosNaming::NamingContext_var cxt; CORBA::Object_var nS = orb->resolve_initial_references("NameService"); cxt = CosNaming::NamingContext::_narrow(nS); CosNaming::Name ncName; ncName.length(1); ncName[0].id = CORBA::string_dup("ClockGenerator"); ncName[0].kind = CORBA::string_dup(""); CORBA::Object_var obj = NULL; std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl; do { try { obj = cxt->resolve(ncName); } catch(...) { std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl; sleep(3); } } while ( obj == NULL ); }とするとwhile文からぬけてこずに, RTC::Properties &props = manager->getConfig(); RTC::CorbaNaming cn = RTC::CorbaNaming(manager->getORB(), props["corba.nameservers"].c_str()); CORBA::Object_ptr obj = NULL; do { try { obj = cn.resolve("ClockGenerator"); }catch(RTC::CorbaNaming::NotFound& ex){ std::cerr << "Can not find ClockGenerator" << std::endl; sleep(3); }catch(CORBA::SystemException &e){ std::cerr << "Exception" << std::endl; sleep(3); } } while ( obj == NULL );としてみると,最初はnotFoundのexceptionが発生していますが,途中からSystemException が発生している,という状況です._______________________________________________openrtm-users mailing listopenrtm-users@openrtm.orghttp://www.openrtm.org/mailman/listinfo/openrtm-users
------------------------------------------------------------
コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法を
ご存知の方がいらっしゃいましたら,方法をご教示いただけると幸いです.
XXComp.cpp のなかで,
CORBA::ORB_var orb;
orb = CORBA::ORB_init(argc, argv);
CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA");
PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj);
PortableServer::POAManager_var manager = rootPOA -> the_POAManager();
CosNaming::NamingContext_var cxt;
CORBA::Object_var nS = orb->resolve_initial_references("NameService");
cxt = CosNaming::NamingContext::_narrow(nS);
CosNaming::Name ncName;
ncName.length(1);
ncName[0].id = CORBA::string_dup("ClockGenerator");
ncName[0].kind = CORBA::string_dup("");
CORBA::Object_var obj = NULL;
do {
try {
obj = cxt->resolve(ncName);
} catch(...) {
std::cerr << "[" << argv[0] << "] wait ClockGenerator" << std::endl;
sleep(3);
}
} while ( obj == NULL );
とすると,所望の振る舞いをしてくれるのですが,
コンポーネントの中のInit関数で以下のようにすると,
void MySampleInit(RTC::Manager* manager)
{
{
CORBA::ORB_var orb = manager->getORB();
CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA");
PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj);
PortableServer::POAManager_var manager = rootPOA -> the_POAManager();
CosNaming::NamingContext_var cxt;
CORBA::Object_var nS = orb->resolve_initial_references("NameService");
cxt = CosNaming::NamingContext::_narrow(nS);
CosNaming::Name ncName;
ncName.length(1);
ncName[0].id = CORBA::string_dup("ClockGenerator");
ncName[0].kind = CORBA::string_dup("");
CORBA::Object_var obj = NULL;
std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl;
do {
try {
obj = cxt->resolve(ncName);
} catch(...) {
std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl;
sleep(3);
}
} while ( obj == NULL );
}
とするとwhile文からぬけてこずに,
RTC::Properties &props = manager->getConfig();
RTC::CorbaNaming cn
= RTC::CorbaNaming(manager->getORB(), props["corba.nameservers"].c_str());
CORBA::Object_ptr obj = NULL;
do {
try {
obj = cn.resolve("ClockGenerator");
}catch(RTC::CorbaNaming::NotFound& ex){
std::cerr << "Can not find ClockGenerator" << std::endl;
sleep(3);
}catch(CORBA::SystemException &e){
std::cerr << "Exception" << std::endl;
sleep(3);
}
} while ( obj == NULL );
としてみると,最初はnotFoundのexceptionが発生していますが,
途中からSystemException が発生している,という状況です.
_______________________________________________
openrtm-users mailing list
openrtm-users@openrtm.org
http://www.openrtm.org/mailman/listinfo/openrtm-users