<div dir="ltr">升谷先生<br><br>安藤です<br><br><br>> 前のメイルでは三つのことを書いたつもりです.<br>><br>> > > コンポーネントを終了する際に,RT System EditorのExitやCtrl+cではなく,<br>> > > ウィンドウの×ボタンを使うと,その後に接続線が消えなかったり,相手側の<br>> > > ポートの色が変わらなかったり,また,相手のコンポーネントの動作が停止す<br>> > > ることがありました.×ボタンを使うと,終了処理が他の場合とは異なるので<br>> > > しょうね.当初は,Ctrl+cと違いがないつもりでいましたので,混乱しました.<br>><br>> に関してはいかがでしょうか?<br><br><div>×ボタンを押す、というのは非常事態時に強制終了するために行う操作でして</div><div>通常はやらないという想定になっております。Ctrl+Cで終了するようにしてください。</div><div><br></div><div>> もう少し試したところ,この問題は,別のPC上のコンポーネントと接続してい<br></div><div>> る場合にしか起きません.同じPC上のコンポーネントと接続している場合<br>> は,×ボタンで終わっても,少しタイムラグはありますが,上述のような問題<br>> は発生しません.<br><br></div><div>RTC自体は一応、相手のRTCが落ちた場合は接続などが残っていても</div><div>自動的にクリーンアップする仕組みが入っております。暫く待っていただければ</div><div>別PC上のRTCとの接続もおそらく消えるのではないかと思いますがいかがでしょうか?</div><div>相手側のIPがunreachableだと、その辺の処理がだいぶ時間がかかる可能性が</div><div>有りますが。また、RTSystemEditor側の同期フレームワーク自体にも</div><div>負担がかかっておかしくなる可能性もあります。</div><div><br></div><div>> 現象から推測しているのですが,<br></div><div><br></div><div>ご指摘の操作はそれぞれ内部でお行われる処理はだいぶ異なります。</div><div>それには、RTC≠プロセス(≒マネージャ)であることをまず念頭に置いてください。</div><div><br></div><div>> ・RT System EditorでコンポーネントをExit.<br><br></div><div>これは、RTCを終了する操作です。この操作ではRTCのみが終了します。</div><div>ただし、通常のRTCのスタンドアロンプログラムのプロセスでは、</div><div>RTCの終了後、他のRTCが全くない場合、マネージャも直ちに終了し</div><div>プロセスが終わります。</div><div><br></div><div>> ・コンポーネントのウィンドウでCtrl+c.<br><br></div><div>この場合は、プロセスに対してSIGINTシグナルが送られ、あらかじめ設定されたハンドラが</div><div>マネージャを終了させます。マネージャは終了する時に、諸々の修了処理を行う前に</div><div>そのマネージャ上で動いているRTCたちに対してexit()をコールして終了させ、終了処理実施後</div><div>最終的にメインスレッドを抜けてプロセスが終わります。</div><div><br></div><div>> と<br>><br>> ・コンポーネントのウィンドウで×ボタンをクリック(ウィンドウを閉じる).<br><br></div><div>一方、コンソール画面の×ボタンは、動いているプロセスのメインスレッドを</div><div>問答無用で終了させます(と私は理解しています)。ご指摘のように、WM_CLOSEなど</div><div>をキャッチするハンドラを登録しておけば、何らかの処理を行うことができますが、</div><div>その時点ではすでにマネージャのスレッドやメインスレッドが強制的に終了しており、</div><div>一連の複雑な修了処理を行うことはもはやできないのではないかと思います。</div><div>したがって、ネームサーバ上には存ぼが残りますし、接続もそのままです。<br></div><div><br></div><div>×ボタンもそうですし、セグメンテーションフォルトやUNIX上での kill -9 コマンドなどで</div><div>強制終了した時も適切に終了処理ができればいいのですが、私が当時実装する時に</div><div>調べた限りでは、あまり有効な方法はなく、これらの部分は一般的なライブラリの</div><div>守備範囲外であるという結論に至りました。何か良い方法がございましたら</div><div>ご教示いただければ幸いです。</div><div><br></div><div>以上、よろしくお願いいたします。</div><div><br></div><div><br></div><div>> では,内部の終了処理が違うのではないでしょうか?<br>><br>> Windowsについて詳しく知らないのですが,少し調べてみたところ,×ボタンを<br>> 押すとWM_COLSEというメッセージが飛ぶそうで,これを捕まえないといけない<br>> のですね.コンポーネントのライブラリの中では,それをやっているでしょう<br>> か?<br>><br>> --<br>> # 升谷 保博<br>> # 大阪電気通信大学 総合情報学部 情報学科<br>> # 575-0063 大阪府四條畷市清滝1130-70 / TEL&FAX: 072-876-5107<br>> _______________________________________________<br>> openrtm-users mailing list<br>> <a href="mailto:openrtm-users@openrtm.org">openrtm-users@openrtm.org</a><br>> <a href="http://www.openrtm.org/mailman/listinfo/openrtm-users">http://www.openrtm.org/mailman/listinfo/openrtm-users</a></div></div>