[openrtm-users 02883] Re: [openrtm-beginners:00477] 終了処理について

Ando Noriaki n-ando @ aist.go.jp
2013年 8月 23日 (金) 11:05:31 JST


安藤です

スタンドアロンコンポーネント(*Comp.exe *Comp 等)の正しい終了のしかたは、
1. Ctrl+C (SIGINT) を送る。
2. RTCをRTSystemEditorなどからexitする。
の2通りあります。WindowsでDOS窓の×ボタンを押す、UNIXでkill -9 する
などは、コンポーネントやマネージャの正しい終了処理が呼び出されないため、
ネームサーバにごみが残るなど副作用があるのでお勧めしません。

また、マネージャ自体を停止させる処理をプログラム的に書く場合は
Manager::instance().shutdown();
が正しい停止処理です。

マネージャはrunManager(false) で呼ばれた場合ブロックします。
http://www.openrtm.org/OpenRTM-aist/documents/current/cxx/classreference_ja/classRTC_1_1Manager.html#a9ed639faf15b1a4fbed8969a3df21b71
# ドキュメントにManager::destroy() とあるのはshutdown()の間違いです。

この場合、これはCtrl+C または SIGINT でシグナルハンドラが呼ばれ、
裏で Manager::instance().shutdown(); が呼ばれることによりrunManager() から抜けます。
予め、別にスレッドを立てておいて、そこから Manager::instance().shutdown(); を呼んでも
構いません。

runManager(true) で呼ばれた場合は、ブロックせずにそのまま抜けてきます。
GUIツールキットのイベントループを別途呼び出す必要がある場合は、こちらの
方法でManagerをrunさせます。

この時も、どこか(GUIからとか?)で Manager::instance().shutdown(); を呼ぶことで
マネージャを終了することができます。

あと、もう少し詳しく説明すると、daemonモードでない (コマンドラインオプションに-dをつけたり、
rtc.conf manager.is_master: YESと設定するとdaemonモードになります。) マネージャの場合
コンポーネントが一つも存在しない場合、かつ以下の設定が有効の場合、
manager.shutdown_on_nortcs: YES
manager.shutdown_auto: YES
自動的に Manager::instance().shutdown(); が呼ばれマネージャが終了します。
コンポーネントが存在するかしないかは、manager.auto_shutdown_duration で
設定された周期でチェックしています。

rtc.confで設定可能なオプションについてはこちらをご覧ください。
http://www.openrtm.org/openrtm/ja/content/rtcconf%E8%A8%AD%E5%AE%9A%E9%A0%85%E7%9B%AE%E4%B8%80%E8%A6%A7




2013/8/22  <n.sugiura.tr @ gmail.com>:
> お世話になります。杉浦と申します。 RTC
> Builderから生成されたコードをみているのですが、
> main関数が以下のようになっておりますが、明示的に
> 終了処理(ライフサイクルの停止やmanagerのdelete等)が
> 無いのですが良いものでしょうか?
> もし必要でしたら正しい終了のさせ方を教えて頂けますでしょうか?
> int main (int argc, char** argv) { RTC::Manager* manager; manager =
> RTC::Manager::init(argc, argv); // Initialize manager manager->init(argc,
> argv); // Set module initialization proceduer // This procedure will be
> invoked in activateManager() function.
> manager->setModuleInitProc(MyModuleInit); // Activate manager and register
> to
> naming service manager->activateManager(); // run the manager in blocking
> mode // runManager(false) is the default. manager->runManager(); // If you
> want to run the manager in non-blocking mode, do like this //
> manager->runManager(true); return 0; }
>
> _______________________________________________
> openrtm-beginners mailing list
> openrtm-beginners @ openrtm.org
> http://www.openrtm.org/mailman/listinfo/openrtm-beginners


More information about the openrtm-users mailing list