显然,boost包含两个独立的状态机库:Statechart和Meta State Machine(MSM).标语给出了非常相似的描述:
你知道两者之间的主要区别和选择考虑因素是什么?
我希望有人可以帮我解决这个问题,或者至少指出我的方式错误......
作为我的问题的简单说明,考虑应用程序的一部分,您可以在其中进入"功能模式"操作状态.然后,取决于用户按下哪个功能键F1-F4,可以使用四个子模式.默认情况下,输入F1模式.状态图从如下开始:

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

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

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

即按F1-F4切换模式会导致外部FunctionMode状态退出并重新进入,同时触发不需要的退出和进入操作.
早在2006年,图书馆作者和用户之间的这个线程似乎描述了同样的问题.我认为作者建议做以下工作:
然而,这种解决方法对我来说似乎并不吸引人:它已经添加了一个额外的状态级别来编译,代码变得不那么可读,深度历史将不得不用于返回任何功能模式子-states和中间状态对象不必要地被破坏并再次构造.
那么......我哪里错了?或者有哪些替代方案?我已经简要介绍了Boost Meta State Machine(msm),但从我到目前为止看到的情况来看,我更喜欢Statechart的外观.
我很惊讶更多的用户没有遇到同样的问题......这让我觉得我的方法可能完全错了!
我有一个状态,一旦 的构造函数完成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) 我有一个继承自boost :: statechart库的类.我需要在Python脚本中使用这个类,我想知道我是否需要为所有boost :: statechart库编写包装代码(.def s),因为我的类继承了它?或者boost.python不需要任何包装代码来查看定义(它自动处理其他boost库以在python中调用)?
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<>作为我的状态的基类有什么区别或含义?
我处于需要修改未编写的状态机的情况。该状态机是使用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:我希望这个问题的标题更好。帮助赞赏。
我正在尝试学习boost :: statechart.
我想制作一个加载文件的小应用程序.
// --------------------------------
// | |
// | O Project |
// | | |
// | v |
// | ---------------------------- |
// | | | |
// | | Unloaded | |
// | ---------------------------- |
// | | ^ |
// | | EvLoad | EvUnload |<-----O
// | v | |
// | ---------------------------- |
// | | | |
// | | Loaded | |
// | ---------------------------- |
// | | …Run Code Online (Sandbox Code Playgroud)