Уведомление об изменении состояния в Boost Statechart

Существует ли простой способ регистрации изменений состояния в Boost Statechart?

Для примера с цифровой камерой, скажем, я решил добавить графический интерфейс в приложение. Есть ли возможность получать уведомления о переходе между состояниями, кроме запросов к состояниям?

if(0 != state_cast<const State1 *>())
{
    context<OuterCotext>().Notify(1);
}
else if(0 != state_cast<const State2 *>())
{
    context<OuterCotext>().Notify(2);
}

1 ответ

Решение

Самый простой способ узнать, что вы изменили состояние, - это ввести деструктор предыдущего состояния, а затем конструктор нового состояния.

#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/simple_state.hpp>
#include <iostream>

namespace sc = boost::statechart;

struct Greeting;
struct Machine : sc::state_machine< Machine, S1> {};

struct S1 : sc::simple_state<S1, Machine>
{
    S1() 
    { // entry
        std::cout << "Enter S1\n"; 
    } 
    ~S1() 
    { // exit
        std::cout << "Exit S1\n"; 
    } 
};

int main()
{
    Machine myMachine;
    myMachine.initiate();

    return 0;
}

демонстрация

В boost.statechart onEntry/onExit действия осуществляются constructor/destructor пары, поскольку экземпляр состояния активен только в том случае, если состояние является текущим состоянием машины.

Таким образом, все, что вы хотите записать, зарегистрировать, войти в систему при изменении состояния (вход или выход), вы можете сделать это внутри этих специальных функций.

Другие вопросы по тегам