[choreonoid-users-ja 00258] Re: ControllerItem内で一時停止/再開を認識するには

伊藤 宣博 norihiro-ito @ eac-inc.co.jp
2017年 9月 25日 (月) 10:01:53 JST


中岡様

ご対応に感謝いたします。大変ありがとうございました。
早速動作を確認させていただきましたので、ご報告させていただきます。

また、他に使われる方もいらっしゃるかもしれませんので、蛇足ながら
共有の意味を込めまして使い方などをまとめます。

1.一時停止/再開時に呼び出したい関数を準備
	voidで引数無しの任意の関数を用意します。

void MyControllerItem::onControlPaused()
{
	printf("Control is paused.\n");
}

void MyControllerItem::onControlResumed()
{
	printf("Control is resumed.\n");
}

2.コントローラのstart()内あたりで、シグナル登録
	一度だけ登録するように、実際にはもう少し工夫が必要です。

cnoid::SimulatorItem* simlator = findOwnerItem<SimulatorItem>();
simlator->sigSimulationPaused().connect(std::bind(&MyControllerItem::onControlPaused, this));
simlator->sigSimulationResumed().connect(std::bind(&MyControllerItem::onControlResumed, this));

3.シミュレーションを開始して、一時停止/再開を試す
	一時停止/再開を行うたびに1回だけ呼ばれます。

以上、よろしくお願いいたします。

On 2017/09/23 11:51, 中岡 慎一郎 wrote:
> 伊藤様
> 
> 産総研の中岡です。
> 遅くなってしまいすみません、一時停止状態の変化を検知するためのシグナルを以下のコミットで追加しました。
> 57d0d799a3ffd5c1aa8de8b515357f9e9469bf98
> 
> 先のメールにあるように、SimulatorItemに
> 
> SignalProxy<void()> sigSimulationPaused();
> SignalProxy<void()> sigSimulationResumed();
> 
> という2つのシグナルを追加しました。
> 
> また、先のメールでは、
> 
>> シグナルの接続先関数はメインスレッドで呼ばれることになりますが、そこから適当な同期処理をしてコントローラ側に通知するということになるかと思います。
> 
> と書いたのですが、今回の実装ではシミュレーションスレッドから呼ばれるようにしました。
> というのも、伊藤さんのご要望ではコントローラ側で状態変化を知りたいとのことでしたので、一時停止の解除時には、その後最初にコントローラの関数(controlとか)が呼ばれる前に確実にコールバック関数が呼ばれたほうが都合がよいのではないかと思いまして。
> 
> メインスレッドから呼ばれるようにすることも可能ですので、今後そのような要望があれば、そちらにも対応できるようにするかもしれません。
> 
> On 09/01/17 17:20, 伊藤 宣博 wrote:
>> 中岡様
>>
>> このような特殊な事例に対応していただけるとのこと、
>> 感謝申し上げます。
>> ソースのアップデータを待ちまして、対応を行って
>> いきたいと思います。
>>
>> ありがとうございました。
>>
>> On 2017/09/01 17:09, 中岡 慎一郎 wrote:
>>> 伊藤様
>>>
>>> なるほど、少し特殊なシミュレーションをされているのですね。
>>> 了解です。
>>>
>>> ちなみにシミュレーションの開始、終了に関しては、SimulatorItemに
>>>
>>> SignalProxy<void()> sigSimulationStarted();
>>> SignalProxy<void()> sigSimulationFinished();
>>>
>>> というシグナルが用意されているのですが、停止態の変化についてはシグナルを定義していなかったことに気が付きました。
>>>
>>> SignalProxy<void()> sigSimulationPaused();
>>> SignalProxy<void()> sigSimulationResumed();
>>>
>>> みたいなシグナルを作って、これによって停止状態の変化を検知することは可能かと思います。
>>>
>>> シグナルの接続先関数はメインスレッドで呼ばれることになりますが、そこから適当な同期処理をしてコントローラ側に通知するということになるかと思います。
>>>
>>> これについて、追加を検討したいと思います。
> 
> 


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