标签: boost-msm

boost msm,如何确定是否发生了转换?

当我触发 process_event("eventname") 时,如何检查是否发生了状态转换或是否调用了 no_transition?

基本上,我希望触发/调用 process_event("eventname") 的类能够判断转换是否发生。目前我无法确定这一点。

有任何想法吗?

谢谢

c++ boost boost-msm

2
推荐指数
1
解决办法
533
查看次数

Boost msm中的线程安全性

我是新兴的元状态库.我正在构建一个应用程序,我必须使用msm.

我的应用程序有两个线程,它们使用相同的msm对象作为共享资源.如果两个线程在同一个msm对象上调用process_event,那么msm是否是线程安全的?

欢迎任何想法.

boost thread-safety boost-msm

2
推荐指数
1
解决办法
1018
查看次数

处理 Boost MSM 中每个状态的错误

我正在使用 Boost MSM 来模拟机器人的行为。有多种状态,如“手动移动”、“自动移动”、“工作”、“空闲”等......但是我需要能够从任何状态强行停止机器人,将其置于无法移动的状态无法接收新命令,因此我创建了“EmergencyStopped”状态。 当机器人被要求重新武装自己时,机器人应该返回到“空闲”状态。

然而,Boost 不建议创建从所有状态到单个状态的转换,而更喜欢使用正交状态。因此,我可以执行“AllOk”和interrupt_state“EmergencyStopped”正交状态。

问题是,虽然我可以轻松地将机器人置于“紧急停止”状态,但我无法退出它并将机器人从之前的状态置于“空闲”状态。例如,如果机器人执行以下操作:

  • [工作,一切正常] -> 停止
  • [工作,紧急停止] -> 恢复

机器人将处于 [Work, AllOk] 状态,而我希望它处于 [Idle, AllOk] 状态。

所以我的问题是:

  • 我可以并且应该在此工作流程中使用正交状态吗?如果是,当我进入正交状态“EmergencyStopped”时,如何强制状态为“空闲”?
  • 或者我应该使“EmergencyStopped”成为非正交并声明从所有状态到它的过渡?
  • 或者还有其他解决方案吗?

c++ boost-msm

2
推荐指数
1
解决办法
894
查看次数

通过延迟自转换来提升MSM并行行为?

我正在使用Boost MSM(基本和仿函数前端),我正在尝试实现以下状态机: 在此输入图像描述

用语言:

  1. 输入州State1
  2. 输入状态A并执行action_A.2秒后,打印"再次尝试..."并重新执行状态A(即调用其输入操作).这永远循环......
  3. 在2(即"并行")的同时,输入状态B并执行action_B.5秒后,打印"再次尝试..."并重新执行状态B(即调用其输入操作).这永远循环......

我想知道在Boost MSM中创建这个状态机的方法.这里有两个技巧,我无法弄清楚如何做:

  • 并行执行(即运行action_A不会同时停止运行action_B)
  • 延迟转换(即状态A在2秒后和状态B在5秒后发生的转换).两个延迟都不应该阻止!过渡应该在这段时间后"开火".

非常感谢您的帮助.

编辑

@TakatoshiKondo回答做了我需要的,但我想对答案的某些部分有更多的解释,以便完全理解它.

  1. 这与pthreads实现相比如何?你觉得Boost.Asio的是不是把状态A和B到不同的线程,并具有拦截,被动等待一个更好的解决方案的每个(如什么可以通过以下方式实现usleep(useconds_t usec)unistd.h)?我的感觉是,我没有尝试过使用Boost.MSM的pthreads会是一个更通用/更少约束的实现吗?
  2. 我不清楚createprocess方法是如何工作的(为什么create函数需要一个可变参数模板?).特别是,我之前没有使用过智能指针std::forward,所以如果你能对这些函数中的每一行给出一个人工解释,那就太棒了(我很难及时阅读这些特性,以便尝试理解这段代码).
  3. 与2一起,更好地解释wpios成员变量的目的Sm将是伟大的.使用ios指针故意满足复制构造函数是什么意思?我还没有看到ios被设置在任何地方,但在构造函数中Sm(boost::asio::io_service* ios) : ios(ios) {},似乎你从来没有打电话?
  4. State1_前端内部,您可以BOOST_STATIC_ASSERT在三种on_entry方法中进行三次调用.这些是做什么的?
  5. main()函数中,我能够删除行auto t = std::make_shared<boost::asio::deadline_timer>(ios);而不改变行为 - 它是多余的吗?

c++ parallel-processing boost wait boost-msm

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