标签: boost-statechart

提升状态图与Meta状态机

显然,boost包含两个独立的状态机库:StatechartMeta State Machine(MSM).标语给出了非常相似的描述:

  • Boost.Statechart - 任意复杂的有限状态机可以用易于阅读和维护的C++代码实现.
  • 元状态机 - 用于富有表现力的UML2有限状态机的高性能库.

你知道两者之间的主要区别和选择考虑因素是什么?

c++ boost state-machine boost-statechart boost-msm

139
推荐指数
3
解决办法
3万
查看次数

提升状态图 - 本地转换

我希望有人可以帮我解决这个问题,或者至少指出我的方式错误......

作为我的问题的简单说明,考虑应用程序的一部分,您可以在其中进入"功能模式"操作状态.然后,取决于用户按下哪个功能键F1-F4,可以使用四个子模式.默认情况下,输入F1模式.状态图从如下开始:

图1

用户可以随时按F1-F4切换到相应的模式.将这些转换添加到内部状态会导致以下情况:

图2

显然这是(a)一团糟,(b)要定义的很多过渡.如果在某些时候我想添加一个F5Mode然后......好吧,你得到了图片.为避免这种情况,我想做以下事情:

图3

Boost Statechart允许我定义从FunctionMode到任何内部状态的转换,但结果不是我所期望的.实际结果如下:

图4

即按F1-F4切换模式会导致外部FunctionMode状态退出并重新进入,同时触发不需要的退出和进入操作.

早在2006年,图书馆作者和用户之间的这个线程似乎描述了同样的问题.我认为作者建议做以下工作:

图5

然而,这种解决方法对我来说似乎并不吸引人:它已经添加了一个额外的状态级别来编译,代码变得不那么可读,深度历史将不得不用于返回任何功能模式子-states和中间状态对象不必要地被破坏并再次构造.

那么......我哪里错了?或者有哪些替代方案?我已经简要介绍了Boost Meta State Machine(msm),但从我到目前为止看到的情况来看,我更喜欢Statechart的外观.

我很惊讶更多的用户没有遇到同样的问题......这让我觉得我的方法可能完全错了!

c++ boost boost-statechart

7
推荐指数
1
解决办法
1774
查看次数

使用 Boost 状态图,如何无条件转换到状态?

我有一个状态,一旦 的构造函数完成A,我想B无条件地转换到它的下一个状态A。这可能吗?

我尝试从构造函数发布一个事件,即使它编译,它也不起作用。谢谢。

编辑:这是我迄今为止尝试过的:

struct A : sc::simple_state< A, Active >
{
    public:
        typedef sc::custom_reaction< EventDoneA > reactions;
        A()
        {
            std::cout << "Inside of A()" << std::endl;
            post_event( EventDoneA() );
        }

        sc::result react( const EventDoneA & )
        {
            return transit< B >();
        }
};
Run Code Online (Sandbox Code Playgroud)

这会产生以下运行时断言失败:

Assertion failed: get_pointer( pContext_ ) != 0, file /includ
e/boost/statechart/simple_state.hpp, line 459
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-statechart

6
推荐指数
1
解决办法
2024
查看次数

Boost.Python是否需要为其他boost库绑定代码?

我有一个继承自boost :: statechart库的类.我需要在Python脚本中使用这个类,我想知道我是否需要为所有boost :: statechart库编写包装代码(.def s),因为我的类继承了它?或者boost.python不需要任何包装代码来查看定义(它自动处理其他boost库以在python中调用)?

c++ boost boost-statechart boost-python python-bindings

5
推荐指数
1
解决办法
123
查看次数

在Boost.Statechart中,state和simple_state有什么区别?

simple_state在使用 Boost.Statechart 实现状态机时,我遇到了一个因尝试从构造函数访问 a 的外部上下文而产生的问题。中的一条评论simple_state.hpp告诉我:

    // This assert fails when an attempt is made to access an outer 
    // context from a constructor of a state that is *not* a subtype of
    // state<>. To correct this, derive from state<> instead of
    // simple_state<>.
Run Code Online (Sandbox Code Playgroud)

除了显然能够从其构造函数访问外部上下文之外,使用state<>而不是simple_state<>作为我的状态的基类有什么区别或含义?

c++ state-machine boost-statechart

4
推荐指数
1
解决办法
1669
查看次数

如何在boost :: statechart中将对象赋予状态?

我处于需要修改未编写的状态机的情况。该状态机是使用Boost Statechart编写的。不幸的是,我发现这个代码坚不可摧的,谁的家伙没有写是在度假。

我认为问题很简单:我有一个thing要在其中某些状态下使用的变量。它代表需要通知事物的单个应用程序控制器。我可以给什么构造函数(或其他什么)thing,以使其可用于机器状态?

根据以下示例声明状态:

struct Pumping : sc::state< Pumping, Purifier >
{
  Pumping( my_context ctx ) : my_base( ctx )
  {
    post_event( EvPumpingStarted() );
  }
  // ...
};
Run Code Online (Sandbox Code Playgroud)

PS:我希望这个问题的标题更好。帮助赞赏。

c++ state-machine boost-statechart

3
推荐指数
1
解决办法
883
查看次数

通过转换来提升状态图传递参数

我正在尝试学习boost :: statechart.

我想制作一个加载文件的小应用程序.

//  --------------------------------
// |                                |
// |           O     Project        |
// |           |                    |
// |           v                    |
// |  ----------------------------  |
// | |                            | |
// | |         Unloaded           | |
// |  ----------------------------  |
// |  |              ^              |
// |  | EvLoad       | EvUnload     |<-----O
// |  v              |              |
// |  ----------------------------  |
// | |                            | |
// | |         Loaded             | |
// |  ----------------------------  |
// |           | …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-statechart statechart

3
推荐指数
1
解决办法
2841
查看次数