Hello list,
I'm experimenting a bit with *boost.msm* from the *boost 1.52* library.
Please consider the following small code snippted which generally defines
a state machine with the states *State1*, *State2* and *State3*, and
the events *Event1* (triggers the transition from State1 to State2) and
*Event2* (triggers the transition from State2 to State3):
#include <iostream>
#include
#include
#include
namespace {
namespace msm = boost::msm;
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;
// ----- Events
struct Event1 {};
struct Event2 {};
// ----- State machine
struct Sm1_:msmf::state_machine_def
{
// States
struct Init:msmf::state<> {};
struct State1:msmf::state<>
{
// Entry action
template
void on_entry(Event const&, Fsm&) {
std::cout << "State1::on_entry()" << std::endl;
}
// Exit action
template
void on_exit(Event const&, Fsm&) {
std::cout << "State1::on_exit()" << std::endl;
}
};
struct State2:msmf::state<>
{
// Entry action
template
void on_entry(Event const&, Fsm&) {
std::cout << "State2::on_entry()" << std::endl;
}
// Exit action
template
void on_exit(Event const&, Fsm&) {
std::cout << "State2::on_exit()" << std::endl;
}
};
struct State3:msmf::state<>
{
// Entry action
template
void on_entry(Event const&, Fsm&) {
std::cout << "State3::on_entry()" << std::endl;
}
// Exit action
template
void on_exit(Event const&, Fsm&) {
std::cout << "State3::on_exit()" << std::endl;
}
};
// Set initial state
typedef State1 initial_state;
// Actions
struct InitAction {
template
void operator()(Event const&, Fsm&, SourceState&, TargetState&)
const
{
std::cout << "InitAction()" << std::endl;
}
};
struct transition_table:mpl::vector<
// Start Event Next Action
Guard
msmf::Row < State1, Event1, State2, msmf::none,
msmf::none >,
msmf::Row < State2, Event2, State3, msmf::none,
msmf::none >
> {};
};
// Pick a back-end
typedef msm::back::state_machine Sm1;
void test()
{
Sm1 sm1;
sm1.start();
std::cout << "> Send Event2" << std::endl;
sm1.process_event(Event2());
std::cout << "> Send Event1" << std::endl;
sm1.process_event(Event1());
}
}
int main()
{
test();
return 0;
}
If I compile and execute the code above the software crashes due to the
fact, that *Event2* is received in the state *State1*.
My understanding of a state machine and boost.msm was, that all events which
are not defined for a particular state, will be just ignored and the state
receiving this unknown event (here *Event2*) will keept.
Is there a possibility in boost.msm ( maybe by adopting to the transition
table) to stay in the current state if an event was received which was not
assigned to this state?
Thank you in advance!
Best regards,
RaRi
--
View this message in context: http://boost.2283326.n4.nabble.com/Boost-MSM-Ignore-events-that-were-not-exp...
Sent from the Boost - Users mailing list archive at Nabble.com.