[choreonoid-users-ja 00143] Re: Plugin中でViewを動的に削除する方法
中岡 慎一郎
s.nakaoka @ aist.go.jp
2014年 11月 25日 (火) 12:27:15 JST
植芝さん
すみません、1.4.0の時点ではViewの表示・非表示を動的に行う部分については
まだ十分に実装されておらず、今回あらためてソースも確認したのですが、確か
にご指摘のような不具合が発生することを確認できました。
1.4.0でこの不具合を解決するにはソースの修正が必要ですが、申し訳ありませ
ん、1.4.0に関しては今のところこちらでは開発リソースを割けない状況です。
一方で、githubで公開している開発版(今後のバージョン1.5候補)について
は、ご要望の機能も既に実現しています。ビューの表示・非表示を切り替えるメ
ニューを標準で装備しており、また表示・非表示の状態はプロジェクトファイル
に保存されます。さらに、同じ種類のビューを複数表示させて、それぞれに違う
コンテンツを表示させるということも実現可能になっています。(例えば
SceneViewを複数表示できるようになっていて、それぞれに異なるシーンを表示
することができます。)さらに一部のビューをメインウィンドウから切り離した
り、メインウィンドウとは別に複数のビューをまとめたウィンドウを表示するこ
ともできます。
ですので、もし可能であれば開発版の方に移行して頂ければ、というのがとりあ
えずの回答になるのですが、いかがでしょうか。(確かにAPIも変わってくる部
分があるので、そこへの対応はお願いすることになってしまいますが…。)
On 11/19/14 07:56, 植芝 俊夫 wrote:
> 産総研の植芝と申します.最近,choreonoidをビジョンシステムのGUIプラットフォームとして
> 使わせて頂くようになりました.素晴らしいソフトウェアを公開していただき,ありがとう
> ございます.
>
> 当方の使用環境は,ubuntu-12.04 または MacOS X 10.9.5(Marvericks) の上で,ソースからコンパイル
> したchoreonoid-1.4.0 を動かしています.ユーザからの指示で複数のViewを動的に生成/削除
> するPluginを書きたいと思っています.この場合,Viewを生成するためには
>
> View* view = new View();
> addView(view);
>
> とすれば良いことはわかるのですが,生成したviewを陽に削除するにはどうすれば良いのでしょうか?
> 試しに
>
> bool removed = MainWindow::instance()->removeView(view)
>
> としてみましたが,戻り値はtrueになるもののタブからViewが消えません.強引に
>
> delete view;
>
> とすると,そのときは消えるものの,choreonoid本体を終了したときにsegmentation faultします.
> このとき,MacOS X上では
>
> Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
> 0 libCnoidBase.1.4.dylib 0x0000000105314d44 cnoid::ExtensionManager::PtrHolder<cnoid::View*>::~PtrHolder() + 36
> 1 libCnoidBase.1.4.dylib 0x0000000105313e91 cnoid::ExtensionManagerImpl::~ExtensionManagerImpl() + 113
> 2 libCnoidBase.1.4.dylib 0x0000000105313d32 cnoid::ExtensionManager::~ExtensionManager() + 34
> 3 libCnoidMultiviewPlugin.dylib 0x000000010fc86901 MultiviewPlugin::~MultiviewPlugin() + 65 (MultiviewPlugin.cc:9)
> 4 libCnoidMultiviewPlugin.dylib 0x000000010fc7f355 MultiviewPlugin::~MultiviewPlugin() + 21 (MultiviewPlugin.cc:9)
> 5 libCnoidMultiviewPlugin.dylib 0x000000010fc7f379 MultiviewPlugin::~MultiviewPlugin() + 25 (MultiviewPlugin.cc:9)
> 6 libCnoidBase.1.4.dylib 0x00000001052be7f9
>
> というようなエラーメッセージが出ますので,スマートポインタ型であるExtensionManager::PtrHolder<View*>が
> 管理しているviewを勝手にdeleteしたため,スマートポインタのデストラクタが呼ばれた時に2重解放になった
> のではないかと推測しています.
>
> 安全にViewを削除する方法をご教示いただければ幸いです.どうかよろしくお願いいたします.
>
> ご参考までに,動作チェックのために書いたコードを以下に添付します.メインメニューの”表示”に”New view”と
> “Close view”の2項目を追加し,前者を選択すると新たなViewを生成,後者を選択すると直近に生成
> したViewを削除する(つもり)のコードです.このコードのままではメニュー操作によってViewを消すことは
> できず,”#if 1”を”#if 0”とすると消すことはできるものの,choreonoid終了時にクラッシュします.
>
>
> ===================================
>
> #include <cnoid/Plugin>
> #include <cnoid/View>
> #include <cnoid/MenuManager>
> #include <cnoid/MainWindow>
> #include <cnoid/MessageView>
> #include <boost/bind.hpp>
> #include <stack>
>
> class MultiviewPlugin : public cnoid::Plugin
> {
> public:
> typedef cnoid::View View;
>
> public:
> MultiviewPlugin() :Plugin("Multiview") {}
>
> virtual bool
> initialize()
> {
> menuManager().setPath("/View")
> .addItem("New view")
> ->sigTriggered()
> .connect(boost::bind(&MultiviewPlugin::onNew, this));
> menuManager().setPath("/View")
> .addItem("Close view")
> ->sigTriggered()
> .connect(boost::bind(&MultiviewPlugin::onClose, this));
>
> return true;
> }
>
> void
> onNew()
> {
> View* view = new View();
> view->setName("My view");
> _views.push(view);
>
> addView(view);
> }
>
> void
> onClose()
> {
> if (_views.empty())
> return;
>
> View* view = _views.top();
> _views.pop();
>
> #if 1
> using namespace cnoid;
>
> bool removed = MainWindow::instance()->removeView(view); // viewが消えない
> if (removed)
> MessageView::instance()->putln("MultiviewPlugin: Removed.");
> else
> MessageView::instance()->putln("MultiviewPlugin: Not Removed.");
>
> MainWindow::instance()->update();
> #else
> delete view; // viewは消えるが,choreonoid終了時にSEGV
> #endif
> }
>
> private:
> std::stack<View*> _views;
> };
>
> CNOID_IMPLEMENT_PLUGIN_ENTRY(MultiviewPlugin);
>
> ===================================
>
> ===================================================================
> 植芝俊夫 t.ueshiba @ aist.go.jp
>
> 産業技術総合研究所
> 知能システム研究部門 タスクビジョン研究グループ
>
> Addr.: 〒305-8568 つくば市梅園1-1-1 産総研つくば中央第2
> Phone: 029-861-5959
>
> _______________________________________________
> choreonoid-users-ja mailing list
> choreonoid-users-ja @ choreonoid.org
> https://choreonoid.org/mailman/listinfo/choreonoid-users-ja
>
--
中岡 慎一郎 <s.nakaoka @ aist.go.jp>
産業技術総合研究所 知能システム研究部門
ヒューマノイド研究グループ
Phone: 029-861-5161 Fax: 029-862-6519
choreonoid-users-ja メーリングリストの案内