当我触发 process_event("eventname") 时,如何检查是否发生了状态转换或是否调用了 no_transition?
基本上,我希望触发/调用 process_event("eventname") 的类能够判断转换是否发生。目前我无法确定这一点。
有任何想法吗?
谢谢
我是新兴的元状态库.我正在构建一个应用程序,我必须使用msm.
我的应用程序有两个线程,它们使用相同的msm对象作为共享资源.如果两个线程在同一个msm对象上调用process_event,那么msm是否是线程安全的?
欢迎任何想法.
我正在使用 Boost MSM 来模拟机器人的行为。有多种状态,如“手动移动”、“自动移动”、“工作”、“空闲”等......但是我需要能够从任何状态强行停止机器人,将其置于无法移动的状态无法接收新命令,因此我创建了“EmergencyStopped”状态。 当机器人被要求重新武装自己时,机器人应该返回到“空闲”状态。
然而,Boost 不建议创建从所有状态到单个状态的转换,而更喜欢使用正交状态。因此,我可以执行“AllOk”和interrupt_state“EmergencyStopped”正交状态。
问题是,虽然我可以轻松地将机器人置于“紧急停止”状态,但我无法退出它并将机器人从之前的状态置于“空闲”状态。例如,如果机器人执行以下操作:
机器人将处于 [Work, AllOk] 状态,而我希望它处于 [Idle, AllOk] 状态。
所以我的问题是:
我正在使用Boost MSM(基本和仿函数前端),我正在尝试实现以下状态机:

用语言:
我想知道在Boost MSM中创建这个状态机的方法.这里有两个技巧,我无法弄清楚如何做:
非常感谢您的帮助.
编辑
@TakatoshiKondo回答做了我需要的,但我想对答案的某些部分有更多的解释,以便完全理解它.
usleep(useconds_t usec)的unistd.h)?我的感觉是,我没有尝试过使用Boost.MSM的pthreads会是一个更通用/更少约束的实现吗?create和process方法是如何工作的(为什么create函数需要一个可变参数模板?).特别是,我之前没有使用过智能指针std::forward,所以如果你能对这些函数中的每一行给出一个人工解释,那就太棒了(我很难及时阅读这些特性,以便尝试理解这段代码).wp和ios成员变量的目的Sm将是伟大的.使用ios指针故意满足复制构造函数是什么意思?我还没有看到ios被设置在任何地方,但在构造函数中Sm(boost::asio::io_service* ios) : ios(ios) {},似乎你从来没有打电话?State1_前端内部,您可以BOOST_STATIC_ASSERT在三种on_entry方法中进行三次调用.这些是做什么的?main()函数中,我能够删除行auto t = std::make_shared<boost::asio::deadline_timer>(ios);而不改变行为 - 它是多余的吗?