【问题标题】:How can I determine if a specific state is Active or not in boost-msm?如何确定特定状态在 boost-msm 中是否处于活动状态?
【发布时间】:2018-07-23 07:05:06
【问题描述】:

在一个状态内完成的处理取决于另一个状态是否处于活动状态。如何确定 boost-msm 中的特定状态是否为 Active?

我想到了下面的伪代码:

auto state = fsm.get_state<MyFsm_::State_x&>(); bool state_Status = state.isActive();

【问题讨论】:

  • 你想知道什么?简单地说,从 fsm 外部获取活动状态?我不确定“在状态内完成的处理”是什么意思。那是过渡的动作吗?
  • 我想简单地检查一个状态是否处于活动状态(从 SM 内部)。在我的用例中,我想做某事:if(stateX==active){ do this ... &amp; transition to stateY} else{ do that ... &amp; transition to stateZ}
  • 你可以使用`const int* current_state()`boost.org/doc/libs/1_67_0/libs/msm/doc/HTML/…获取状态索引。状态索引定义为如下顺序boost.org/doc/libs/1_67_0/libs/msm/doc/HTML/…
  • 你提到“从SM内部”,当以“if(stateX==actime){ ...”开头的语句被触发时?我认为“在 SM 内部”意味着动作,例如进入/退出,过渡动作。顺便问一下,在这种情况下您使用了多少个状态机实例?
  • fsm.current_state() 返回一个整数数组(即活动状态 ID)。当我不知道数组的大小时如何使用它?

标签: c++ boost template-meta-programming state-machine boost-msm


【解决方案1】:

您可以查看链接(关于标志和获取状态):https://www.boost.org/doc/libs/1_64_0/libs/msm/doc/HTML/ch03s05.html#d0e2489

但是,boost-msm 速度很快,但也非常复杂。如果使用不当,会使您的代码难以理解。

我建议您使用状态模式

【讨论】:

  • 使用标志需要我为每个状态定义一个附加结构用作“标志”(例如struct S1Active{}),然后将标志分配给每个状态(即typedef mpl::vector&lt;S1Active&gt; flag_list)。我认为 boost-MSM 会为这种用例设计一种更好的方法(我想这很常见)。也可以在状态内使用bool isActive 并根据需要检查它(fsm.get_state&lt;MyFsm_::State_x&amp;&gt;().isActive)。 高度赞赏任何其他/更好的解决方案
  • @Guo:您的第二个注意事项(使用状态模式)很重要:有人建议我使用经过充分测试的成熟状态机实现 生产 而不是自己从头开始实施“设计模式”。 我希望其他 cmets 了解此问题 ...提前致谢。
最近更新 更多