[choreonoid-users-ja 00262] Re: 複数のウィンドウを表示する方法について

Shin'ichiro Nakaoka s.nakaoka @ aist.go.jp
2017年 12月 5日 (火) 14:35:03 JST


宮本様

産総研の中岡です。

まだコードを読んだわけではありませんが、

> QWidgetのshow関数を呼び出した時にプロセスが異常終了したり、あるいは
ウィンドウが表示されないことがあります。

というのの原因として考えられるのは、メインスレッド以外のスレッドからその
ようなコードを実行していないかということです。

QtのGUIに関わるクラスは基本的には全てメインスレッドから実行することを前
提としています。RTCですとonXXXの関数やサービスポートから呼ばれる関数など
はメインスレッドとは別のスレッドで実行されることになるため、そのようなと
ころからQtの関数を実行するとうまく動きません。

対策としては、GUIに関わるコードは、イベントを経由して、メインスレッドか
ら非同期的に実行するようにします。Choreonoidではsrc/Base/LazeCaller.h で
定義しているクラスや関数でこれを行うことができます。

例えば、

 callLater(function);

などとすると、function関数はその場では呼ばれずに、「この関数を呼んでくれ
と言うイベント」がQtのイベントループに投げられて、メインスレッドでそのイ
ベントが処理されるタイミングで関数が呼ばれるようになります。

メンバ関数などを呼びたい場合は、ラムダ式などを使って、

 callLater([&](){ memberFunction(); });

みたく使ってください。

今回の件に関しては検討違いかもしれませんが、これ以外の理由でQtのウィンド
ウが表示されなかったり落ちたりといったことは(Qtの関数を正しく使っている
限りでは)あまり考えられないので、とりあえずお知らせした次第です。


On 2017/12/05 14:06, 宮本信彦 wrote:
> Choreonoid MLの皆さま
> 
> 
> 産総研の宮本と申します。
> 
> 
> Choreonoid本体のウィンドウ以外に、アイテム追加のたびに別ウィンドウを表示するプラグインを作成しているのですが、QWidgetのshow関数を呼び出した時にプロセスが異常終了したり、あるいはウィンドウが表示されないことがあります。
> 
> 以下がソースコードです。
> 
> https://github.com/Nobu19800/OpenRTMPythonPlugin/blob/master/RTCEditorItem.cpp#L126
> 
> Windows 10、Visual Studio 2015、Qt 5.8で動作確認しています。
> 
> 
> Choreonoidで本体のウィンドウ以外のウィンドウを表示させる方法について、正式な方法があるようでしたら教えていただければ幸いです。
> 
> 
> よろしくお願いします。
> 
> 
> 
> _______________________________________________
> choreonoid-users-ja mailing list
> choreonoid-users-ja @ choreonoid.org
> https://choreonoid.org/mailman/listinfo/choreonoid-users-ja
> 


-- 
中岡 慎一郎 <s.nakaoka @ aist.go.jp>
産業技術総合研究所 知能システム研究部門
ヒューマノイド研究グループ



choreonoid-users-ja メーリングリストの案内