如何从/从/增强MSM statemachine的数据

How to exchange data from/to boost MSM statemachine

本文关键字:数据 statemachine 增强 MSM      更新时间:2023-10-16

我是MSM的新手,我认为这是一个很棒的工具,尤其是EUML前端方法。但是,经过几天的阅读,我仍然不确定如何在MSM EUML定义的statemachine和外部世界之间交换数据。在我看来,两种可能的方法是:

  1. 使用" attributes_< ant1"将属性添加到statemachine中,然后以某种方式从外部世界访问attr1

  2. 使用全局变量,其中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: Emptyn";
    }

get_attribute((和名称是关键点的组合。

**创建具有属性的状态计算机。

例如,

// 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;

您可以使用状态机的前端和后端的get_attribute()

演示

这里正在运行演示:https://wandbox.org/permlink/nkqb2pex5azkebou

my_attr_logger是属性的名称。

我刚刚添加了std::stringstream作为属性。基本代码是官方示例代码。请参阅https://www.boost.org/doc/libs/1_66_0/libs/mmsm/doc/html/examples/simplephoenix.cpp