[openrtm-users 00049] RTシステムの終了について

7 posts / 0 new
Last post
root
Offline
Last seen: 1 hour 51 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00049] RTシステムの終了について

いつも御世話になります。宇田@NECシステムテクノロジーです

RTシステムの終了方法についてご教授ください。

1つのRTシステム全体を統括している(アプリケーションに相当する)
コンポーネントがあり、そこからシステム全体に対して終了指示を出し
たい場合、何か統一的な枠組みはありますでしょうか?

例えば以下の例で、統括コンポーネントからの終了指示をもとに、その
コンポーネント自身とサブコンポーネント1〜4のスレッドだけでなく、
それらを包含するプロセスA〜C(XXXComp の実装方式に準拠)も終了
させたい場合、終了指示を適切に伝える方法はありますでしょうか。

プロセスA
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ┌─────────────────────┐ ┃
┃ │ ┌────┐ │ ┃
┃   └→○┤ 統括 ├○──┐ │ ┃
┃ │コンポー│ │ │ ┃
┃ ┌──→○┤ ネント ├○─┐│ │ ┃
┃ │ └────┘ ││ │ ┃
┃ │┌───────────┘│ │ ┃
┗━││┌───────────┘━━━━━━━━━│━┛
│││ │
│││ プロセスB │
┏━│││━━━━━━━━━━━━━━━━━━━━━│━┓
┃ │││ │ ┃
┃ │││ ┌────┐ ┌────┐ │ ┃
┃ ││└→○┤ サブ ├○──→○┤ サブ ├○─┘ ┃
┃ ││ │コンポー│ │コンポー│ ┃
┃ ││ ○┤ネント1├○ ○┤ネント2├○ ┃
┃ ││ └────┘ └────┘ ┃
┃ ││ ┃
┗━││━━━━━━━━━━━━━━━━━━━━━━━━┛
││
││ プロセスC
┏━││━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ││ ┃
┃ ││ ┌────┐ ┌────┐ ┃
┃ │└─→○┤ サブ ├○──→○┤ サブ ├○─┐ ┃
┃ │ │コンポー│ │コンポー│ │ ┃
┃ │   ○┤ネント3├○ ○┤ネント4├○ │ ┃
┃ │ └────┘ └────┘ │ ┃
┃ └───────────────────────┘ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Undefined
root
Offline
Last seen: 1 hour 51 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00050] RTシステムの終了について

宇田様

安藤@産総研です

> いつも御世話になります。宇田@NECシステムテクノロジーです
>
> RTシステムの終了方法についてご教授ください。
>
> 1つのRTシステム全体を統括している(アプリケーションに相当する)
> コンポーネントがあり、そこからシステム全体に対して終了指示を出し
> たい場合、何か統一的な枠組みはありますでしょうか?

終了指示というのは、コンポーネントをExit状態にできればいいのでしょうか?
でしたら、各コンポーネントに対し、rtc_exit() を呼べば
(ACTIVE状態の場合は、rtc_stop(), rtc_exit()の順で呼ぶ)終了できるはずです。

ですので、統括コンポーネントは、サブコンポーネントのオブジェクト
リファレンスを何らかの方法で取得できていなければなりません。

マネージャには一応 findComponents というメソッドが用意されています。
これで、サブコンポーネントを探し出して、listか何かに入れて、
終了時に、list内のコンポーネントに対して一気にrtc_exit()を呼んでやれば
サブコンポーネントも止めることができます。

> 例えば以下の例で、統括コンポーネントからの終了指示をもとに、その
> コンポーネント自身とサブコンポーネント1〜4のスレッドだけでなく、
> それらを包含するプロセスA〜C(XXXComp の実装方式に準拠)も終了
> させたい場合、終了指示を適切に伝える方法はありますでしょうか。

プロセスを終了する公にされている方法はありません。
ただし、マネージャのメインループ (runManager()) が終了されれば、
プロセスも終了するので、これがご希望の方法だとおもいます。

本来なら、ユーザプログラムから、マネージャを終了させる
メソッドを提供すべきなのですが、今のところそういうものはありません。
#次バージョンでは提供いたします。

ただし、SIG_INIT(Ctrl+C)の割り込みハンドラhandler()という関数が
ありまして、こいつを呼ぶとマネージャが終了します。

ですので、この関数を呼びたい場所のファイルの中で、

extern "C" void handler (int);

と宣言しておいて、終了させたいタイミングで、

handler(0);

などと呼んでやると、もしかしたらプロセスを終了させられるかもしれません。

#こちらでもやってみましたが、一応runManager()は抜けるものの、
#CORBAの例外がでてアボートしました。

>
>
> プロセスA
> ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
> ┃ ┌─────────────────────┐ ┃
> ┃ │ ┌────┐ │ ┃
> ┃   └→○┤ 統括 ├○──┐ │ ┃
> ┃ │コンポー│ │ │ ┃
> ┃ ┌──→○┤ ネント ├○─┐│ │ ┃
> ┃ │ └────┘ ││ │ ┃
> ┃ │┌───────────┘│ │ ┃
> ┗━││┌───────────┘━━━━━━━━━│━┛
> │││ │
> │││ プロセスB │
> ┏━│││━━━━━━━━━━━━━━━━━━━━━│━┓
> ┃ │││ │ ┃
> ┃ │││ ┌────┐ ┌────┐ │ ┃
> ┃ ││└→○┤ サブ ├○──→○┤ サブ ├○─┘ ┃
> ┃ ││ │コンポー│ │コンポー│ ┃
> ┃ ││ ○┤ネント1├○ ○┤ネント2├○ ┃
> ┃ ││ └────┘ └────┘ ┃
> ┃ ││ ┃
> ┗━││━━━━━━━━━━━━━━━━━━━━━━━━┛
> ││
> ││ プロセスC
> ┏━││━━━━━━━━━━━━━━━━━━━━━━━━┓
> ┃ ││ ┃
> ┃ ││ ┌────┐ ┌────┐ ┃
> ┃ │└─→○┤ サブ ├○──→○┤ サブ ├○─┐ ┃
> ┃ │ │コンポー│ │コンポー│ │ ┃
> ┃ │   ○┤ネント3├○ ○┤ネント4├○ │ ┃
> ┃ │ └────┘ └────┘ │ ┃
> ┃ └───────────────────────┘ ┃
> ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
>
>
>

root
Offline
Last seen: 1 hour 51 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00051] RTシステムの終了について

To: 産総研 安藤様

いつも御世話になります。宇田@NECシステムテクノロジーです

ご回答ありがとうございます。

> 宇田様
>
> 安藤@産総研です
>
> > いつも御世話になります。宇田@NECシステムテクノロジーです
> >
> > RTシステムの終了方法についてご教授ください。
> >
> > 1つのRTシステム全体を統括している(アプリケーションに相当する)
> > コンポーネントがあり、そこからシステム全体に対して終了指示を出し
> > たい場合、何か統一的な枠組みはありますでしょうか?
>
> 終了指示というのは、コンポーネントをExit状態にできればいいのでしょうか?
> でしたら、各コンポーネントに対し、rtc_exit() を呼べば
> (ACTIVE状態の場合は、rtc_stop(), rtc_exit()の順で呼ぶ)終了できるはずです。
>
> ですので、統括コンポーネントは、サブコンポーネントのオブジェクト
> リファレンスを何らかの方法で取得できていなければなりません。
>
> マネージャには一応 findComponents というメソッドが用意されています。
> これで、サブコンポーネントを探し出して、listか何かに入れて、
> 終了時に、list内のコンポーネントに対して一気にrtc_exit()を呼んでやれば
> サブコンポーネントも止めることができます。

こちらの findComponents は、同じネーミングサービスに登録されている
コンポーネントであれば(ホストやプロセスが異なっていても)全て検索
できるのでしょうか?

また、引数にコンポーネント名を取るようですが、ワイルドカード指定の
ようなものは可能でしょうか、それとも探すべきコンポーネント名は要求
元で全て把握している必要がありますでしょうか?

> > 例えば以下の例で、統括コンポーネントからの終了指示をもとに、その
> > コンポーネント自身とサブコンポーネント1〜4のスレッドだけでなく、
> > それらを包含するプロセスA〜C(XXXComp の実装方式に準拠)も終了
> > させたい場合、終了指示を適切に伝える方法はありますでしょうか。
>
> プロセスを終了する公にされている方法はありません。
> ただし、マネージャのメインループ (runManager()) が終了されれば、
> プロセスも終了するので、これがご希望の方法だとおもいます。

はい、この方法を教えて頂きたいと思っていました。

> 本来なら、ユーザプログラムから、マネージャを終了させる
> メソッドを提供すべきなのですが、今のところそういうものはありません。
> #次バージョンでは提供いたします。
>
> ただし、SIG_INIT(Ctrl+C)の割り込みハンドラhandler()という関数が
> ありまして、こいつを呼ぶとマネージャが終了します。
>
> ですので、この関数を呼びたい場所のファイルの中で、
>
> extern "C" void handler (int);
>
> と宣言しておいて、終了させたいタイミングで、
>
> handler(0);
>
> などと呼んでやると、もしかしたらプロセスを終了させられるかもしれません。
>
> #こちらでもやってみましたが、一応runManager()は抜けるものの、
> #CORBAの例外がでてアボートしました。

通常の場合は、runManager()を含むプロセスは(コンソールウィンドウを
閉じるなどの操作で)強制終了させることになるのでしょうか?

root
Offline
Last seen: 1 hour 51 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00052] RTシステムの終了について

安藤です

> > 安藤@産総研です
> >
> > > いつも御世話になります。宇田@NECシステムテクノロジーです
> > >
> > > RTシステムの終了方法についてご教授ください。
> > >
> > > 1つのRTシステム全体を統括している(アプリケーションに相当する)
> > > コンポーネントがあり、そこからシステム全体に対して終了指示を出し
> > > たい場合、何か統一的な枠組みはありますでしょうか?
> >
> > 終了指示というのは、コンポーネントをExit状態にできればいいのでしょうか?
> > でしたら、各コンポーネントに対し、rtc_exit() を呼べば
> > (ACTIVE状態の場合は、rtc_stop(), rtc_exit()の順で呼ぶ)終了できるはずです。
> >
> > ですので、統括コンポーネントは、サブコンポーネントのオブジェクト
> > リファレンスを何らかの方法で取得できていなければなりません。
> >
> > マネージャには一応 findComponents というメソッドが用意されています。
> > これで、サブコンポーネントを探し出して、listか何かに入れて、
> > 終了時に、list内のコンポーネントに対して一気にrtc_exit()を呼んでやれば
> > サブコンポーネントも止めることができます。
>
> こちらの findComponents は、同じネーミングサービスに登録されている
> コンポーネントであれば(ホストやプロセスが異なっていても)全て検索
> できるのでしょうか?
>
> また、引数にコンポーネント名を取るようですが、ワイルドカード指定の
> ようなものは可能でしょうか、それとも探すべきコンポーネント名は要求
> 元で全て把握している必要がありますでしょうか?

ネームサービスに登録されているコンポーネントを正規表現
を使って検索できます。
ですので、戻り値はリストになっています。

> > > 例えば以下の例で、統括コンポーネントからの終了指示をもとに、その
> > > コンポーネント自身とサブコンポーネント1〜4のスレッドだけでなく、
> > > それらを包含するプロセスA〜C(XXXComp の実装方式に準拠)も終了
> > > させたい場合、終了指示を適切に伝える方法はありますでしょうか。
> >
> > プロセスを終了する公にされている方法はありません。
> > ただし、マネージャのメインループ (runManager()) が終了されれば、
> > プロセスも終了するので、これがご希望の方法だとおもいます。
>
> はい、この方法を教えて頂きたいと思っていました。
>
>
> > 本来なら、ユーザプログラムから、マネージャを終了させる
> > メソッドを提供すべきなのですが、今のところそういうものはありません。
> > #次バージョンでは提供いたします。
> >
> > ただし、SIG_INIT(Ctrl+C)の割り込みハンドラhandler()という関数が
> > ありまして、こいつを呼ぶとマネージャが終了します。
> >
> > ですので、この関数を呼びたい場所のファイルの中で、
> >
> > extern "C" void handler (int);
> >
> > と宣言しておいて、終了させたいタイミングで、
> >
> > handler(0);
> >
> > などと呼んでやると、もしかしたらプロセスを終了させられるかもしれません。
> >
> > #こちらでもやってみましたが、一応runManager()は抜けるものの、
> > #CORBAの例外がでてアボートしました。
>
> 通常の場合は、runManager()を含むプロセスは(コンソールウィンドウを
> 閉じるなどの操作で)強制終了させることになるのでしょうか?

通常はCtrl+C (SIGINT) で終了させます。
SIGINTで終了させると、配下のコンポーネントをすべて安全に
終了させ、かつネームサーバから自分の名前を削除して終わります。

それ以外の方法ですと、コンポーネントがActive状態のまま終わったり、
ネームサーバに名前が残ったままになります。

root
Offline
Last seen: 1 hour 51 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00053] RTシステムの終了について

いつも御世話になります。宇田@NECシステムテクノロジーです

> 安藤です
>
> > > 安藤@産総研です
> > >
> > > > いつも御世話になります。宇田@NECシステムテクノロジーです
> > > >
> > > > RTシステムの終了方法についてご教授ください。
> > > >
> > > > 1つのRTシステム全体を統括している(アプリケーションに相当する)
> > > > コンポーネントがあり、そこからシステム全体に対して終了指示を出し
> > > > たい場合、何か統一的な枠組みはありますでしょうか?
> > >
> > > 終了指示というのは、コンポーネントをExit状態にできればいいのでしょうか?
> > > でしたら、各コンポーネントに対し、rtc_exit() を呼べば
> > > (ACTIVE状態の場合は、rtc_stop(), rtc_exit()の順で呼ぶ)終了できるはずです。
> > >
> > > ですので、統括コンポーネントは、サブコンポーネントのオブジェクト
> > > リファレンスを何らかの方法で取得できていなければなりません。
> > >
> > > マネージャには一応 findComponents というメソッドが用意されています。
> > > これで、サブコンポーネントを探し出して、listか何かに入れて、
> > > 終了時に、list内のコンポーネントに対して一気にrtc_exit()を呼んでやれば
> > > サブコンポーネントも止めることができます。
> >
> > こちらの findComponents は、同じネーミングサービスに登録されている
> > コンポーネントであれば(ホストやプロセスが異なっていても)全て検索
> > できるのでしょうか?
> >
> > また、引数にコンポーネント名を取るようですが、ワイルドカード指定の
> > ようなものは可能でしょうか、それとも探すべきコンポーネント名は要求
> > 元で全て把握している必要がありますでしょうか?
>
> ネームサービスに登録されているコンポーネントを正規表現
> を使って検索できます。
> ですので、戻り値はリストになっています。

了解致しました。どうもありがとうございます。

> > > > 例えば以下の例で、統括コンポーネントからの終了指示をもとに、その
> > > > コンポーネント自身とサブコンポーネント1〜4のスレッドだけでなく、
> > > > それらを包含するプロセスA〜C(XXXComp の実装方式に準拠)も終了
> > > > させたい場合、終了指示を適切に伝える方法はありますでしょうか。
> > >
> > > プロセスを終了する公にされている方法はありません。
> > > ただし、マネージャのメインループ (runManager()) が終了されれば、
> > > プロセスも終了するので、これがご希望の方法だとおもいます。
> >
> > はい、この方法を教えて頂きたいと思っていました。
> >
> >
> > > 本来なら、ユーザプログラムから、マネージャを終了させる
> > > メソッドを提供すべきなのですが、今のところそういうものはありません。
> > > #次バージョンでは提供いたします。
> > >
> > > ただし、SIG_INIT(Ctrl+C)の割り込みハンドラhandler()という関数が
> > > ありまして、こいつを呼ぶとマネージャが終了します。
> > >
> > > ですので、この関数を呼びたい場所のファイルの中で、
> > >
> > > extern "C" void handler (int);
> > >
> > > と宣言しておいて、終了させたいタイミングで、
> > >
> > > handler(0);
> > >
> > > などと呼んでやると、もしかしたらプロセスを終了させられるかもしれません。
> > >
> > > #こちらでもやってみましたが、一応runManager()は抜けるものの、
> > > #CORBAの例外がでてアボートしました。
> >
> > 通常の場合は、runManager()を含むプロセスは(コンソールウィンドウを
> > 閉じるなどの操作で)強制終了させることになるのでしょうか?
>
> 通常はCtrl+C (SIGINT) で終了させます。
> SIGINTで終了させると、配下のコンポーネントをすべて安全に
> 終了させ、かつネームサーバから自分の名前を削除して終わります。
>
> それ以外の方法ですと、コンポーネントがActive状態のまま終わったり、
> ネームサーバに名前が残ったままになります。

了解致しました。

伺いました内容から推測すると、統合コンポーネントから全システムを
終了させるには

root
Offline
Last seen: 1 hour 51 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00054] RTシステムの終了について

安藤です

>了解致しました。
>
>伺いました内容から推測すると、統合コンポーネントから全システムを
>終了させるには
>
>

root
Offline
Last seen: 1 hour 51 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00055] RTシステムの終了について

いつも御世話になります。宇田@NECシステムテクノロジーです

> 安藤です
>
> >了解致しました。
> >
> >伺いました内容から推測すると、統合コンポーネントから全システムを
> >終了させるには
> >
> >

Log in or register to post comments

Download

latest Releases : 2.0.0-RELESE

2.0.0-RELESE Download page

Number of Projects

Choreonoid

Motion editor/Dynamics simulator

OpenHRP3

Dynamics simulator

OpenRTP

Integrated Development Platform

AIST RTC collection

RT-Components collection by AIST

TORK

Tokyo Opensource Robotics Association

DAQ-Middleware

Middleware for DAQ (Data Aquisition) by KEK