如何交换数据from/to boost MSM statemachine
How to exchange data from/to boost MSM statemachine
我是 MSM 的新手,我认为它是一个很棒的工具,尤其是 eUML 前端方法。然而,经过几天的阅读,我仍然不太确定如何在 MSM eUML 定义的状态机和外部世界之间交换数据。我认为两种可能的方式是:
使用 "attributes_ << Attr1" 将属性添加到状态机中,然后以某种方式从外部世界访问 Attr1
使用全局变量,fsm动作函数存储数据,外部代码读取数据
我还没有想出任何其他更好的方法。关于方法 1,我不确定如何从外部访问 Attr1。我想 "fsm_(Attr1)" 只被 fsm 内部函数或方法用来访问属性。那么有没有办法让外人读取数据呢"fsm.Attr1"?
至于方法2,显然全局变量是我们一直尽量避免的东西。
欢迎提出任何建议!
您可以按照以下步骤进行操作:
第一个定义属性。
BOOST_MSM_EUML_DECLARE_ATTRIBUTE(type,name)
例如,
BOOST_MSM_EUML_DECLARE_ATTRIBUTE(std::stringstream,my_attr_logger)
访问属性。
fsm.get_attribute(name)
例如,
template <class Event,class FSM>
void on_entry(Event const& /*evt*/,FSM& fsm)
{
std::cout << "entering: Empty" << std::endl;
fsm.get_attribute(my_attr_logger) << "entering: Empty\n";
}
get_attribute()和name的组合是重点
**创建带属性的状态机。
见https://www.boost.org/doc/libs/1_66_0/libs/msm/doc/HTML/ch03s04.html#eUML-build-sm
例如,
// create a state machine "on the fly"
BOOST_MSM_EUML_DECLARE_STATE_MACHINE(( transition_table, //STT
init_ << Empty, // Init State
no_action, // Entry
no_action, // Exit
attributes_ << my_attr_logger, // ==== Attributes
configure_ << no_configure_, // configuration
Log_No_Transition // no_transition handler
),
player_) //fsm name
**最后,从外部世界通过状态机后端访问属性。
statemachine_backend.get_attribute(name)
例如,
std::cout <<p.get_attribute(my_attr_logger).str() << std::endl;
可以使用front-end的get_attribute()
和back-end的状态机。
演示
这里是 运行 演示:
https://wandbox.org/permlink/nKqb2pEX5AZKeboU
my_attr_logger是属性名。
我刚刚添加了 std::stringstream
作为属性。基本代码是官方示例代码。参见 https://www.boost.org/doc/libs/1_66_0/libs/msm/doc/HTML/examples/SimplePhoenix.cpp
我是 MSM 的新手,我认为它是一个很棒的工具,尤其是 eUML 前端方法。然而,经过几天的阅读,我仍然不太确定如何在 MSM eUML 定义的状态机和外部世界之间交换数据。我认为两种可能的方式是:
使用 "attributes_ << Attr1" 将属性添加到状态机中,然后以某种方式从外部世界访问 Attr1
使用全局变量,fsm动作函数存储数据,外部代码读取数据
我还没有想出任何其他更好的方法。关于方法 1,我不确定如何从外部访问 Attr1。我想 "fsm_(Attr1)" 只被 fsm 内部函数或方法用来访问属性。那么有没有办法让外人读取数据呢"fsm.Attr1"?
至于方法2,显然全局变量是我们一直尽量避免的东西。
欢迎提出任何建议!
您可以按照以下步骤进行操作:
第一个定义属性。
BOOST_MSM_EUML_DECLARE_ATTRIBUTE(type,name)
例如,
BOOST_MSM_EUML_DECLARE_ATTRIBUTE(std::stringstream,my_attr_logger)
访问属性。
fsm.get_attribute(name)
例如,
template <class Event,class FSM>
void on_entry(Event const& /*evt*/,FSM& fsm)
{
std::cout << "entering: Empty" << std::endl;
fsm.get_attribute(my_attr_logger) << "entering: Empty\n";
}
get_attribute()和name的组合是重点
**创建带属性的状态机。
见https://www.boost.org/doc/libs/1_66_0/libs/msm/doc/HTML/ch03s04.html#eUML-build-sm
例如,
// create a state machine "on the fly"
BOOST_MSM_EUML_DECLARE_STATE_MACHINE(( transition_table, //STT
init_ << Empty, // Init State
no_action, // Entry
no_action, // Exit
attributes_ << my_attr_logger, // ==== Attributes
configure_ << no_configure_, // configuration
Log_No_Transition // no_transition handler
),
player_) //fsm name
**最后,从外部世界通过状态机后端访问属性。
statemachine_backend.get_attribute(name)
例如,
std::cout <<p.get_attribute(my_attr_logger).str() << std::endl;
可以使用front-end的get_attribute()
和back-end的状态机。
演示
这里是 运行 演示: https://wandbox.org/permlink/nKqb2pEX5AZKeboU
my_attr_logger是属性名。
我刚刚添加了 std::stringstream
作为属性。基本代码是官方示例代码。参见 https://www.boost.org/doc/libs/1_66_0/libs/msm/doc/HTML/examples/SimplePhoenix.cpp