问题标签 [boost-msm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2115 浏览

c++ - Boost MSM 仅处理内部转换

我正在使用新的 Boost 1.44.0 MSM 库来生成状态机。在这个状态机中有两类事件class1class2class1事件可以由状态处理,或者事件S1只能由状态处理。S2class2S2

一个特殊class1事件upgrade_req要求从一个州升级S1到另一个州S2

我在 Boost::MSM 中实现了如下:

我的问题是,当我按原样使用它时,该upgrade_req事件永远不会被 main 处理MyFSM::transition_table。它仅由S1::internal_transition_table.

例如:

我希望这个输出是:

处理状态 1 中的事件。
升级请求正常。
处理状态 2 中的事件。

但是,我得到的是:

处理状态 1
中的事件。处理状态 1 中的事件。
错误。在状态 1 中接收到 2 类事件。

有人对我如何解决此问题有建议吗?

谢谢,保罗

0 投票
5 回答
34489 浏览

c++ - Boost Statechart vs. 元状态机

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

  • Boost.Statechart - 任意复杂的有限状态机可以用易于阅读和维护的 C++ 代码实现。
  • Meta State Machine - 一个非常高性能的库,用于表达 UML2 有限状态机。

您知道在两者之间进行选择的主要区别是什么吗?

0 投票
1 回答
694 浏览

c++ - 如何在 on_entry 中使用 Boost.MSM is_flag_active?

我想在我的状态的 on_entry 模板函数之一中使用 is_flag_active() 函数:

但是我得到了以下编译错误:

但是在状态机之外,我的意思是如果我首先声明一个状态机,我可以使用 is_flag_active:

如果我使用前端的 is_flag_,我会再次遇到编译器错误(msm::back::state_machine 中没有这样的函数)。

知道如何将 is_flag_active 与 on_entry 一起使用吗?或者,如果不可能,还有其他选择吗?

感谢您的帮助,加博尔

0 投票
0 回答
193 浏览

c++ - 状态机单选按钮

如何在boost 元状态机中实现单选按钮?
问题是转换的数量呈二次方增长,例如,使用 3 个按钮时,选项是:

但是有 4 个按钮的选项是:

有没有办法做类似的事情

在提升元状态机?

0 投票
0 回答
540 浏览

c++ - Boost 状态机延迟事件

如果第二个转换连续两次延迟,是否可以丢弃第一个?

0 投票
2 回答
2316 浏览

c++ - 如何访问(增强元)状态机中的所有状态?

有没有办法访问 boost msm 中的所有状态(不仅是活动状态)?例如,放置在状态中的所有 UI 控件都应在调整大小事件上调整大小,而不管它们的状态是否处于活动状态。

更新:让我澄清一下,我需要某种迭代器来遍历我的状态机创建的所有对象状态。

更新#2:下面是一个例子。我需要调用所有状态的resize方法。

0 投票
2 回答
5688 浏览

c++ - 提升 MSM - 更清晰

我想使用 boost msm 状态机,但我很难想象它是如何工作的。假设我们只有 2 个状态(s1,s2),要从 s1 转到 s2,您需要触发事件 e1,而要返回则需要另一个 e2。e1 和 e2 只能分别从 s1 和 s2 内触发。

现在在 main() 中,我首先启动状态机 (start()),然后会有一个 while 循环,每 1 分钟将返回到状态机,但必须从它离开的地方继续。

所以基本上当一个状态完成执行时,状态机将退出,然后会有 1 分钟的延迟,然后 while 循环需要将我带回到我退出之前的状态,或者我认为这就是我们应该如何实现状态机。

我的要求是不是很不寻常?如果是,那么人们如何实现非阻塞状态机?如果没有,那么我该如何实现 Go_backtoStatemachine()?

0 投票
1 回答
758 浏览

c++ - Boost MSM 库给出错误

下面的代码是 boost msm 文档中针对仿函数前端给出的示例。

当我试图构建它时,它给我的错误不是在这个文件中,而是在 boost 库文件 proto 中。以下是我得到的错误

我在这里想念什么?

0 投票
1 回答
551 浏览

c++ - boost msm,我如何确定是否发生了转换?

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

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

有任何想法吗?

谢谢

0 投票
1 回答
1169 浏览

c++ - 使用事件和状态重用来提升 msm 问题

我的转换表和事件有问题。让我解释一下说明问题的假设计:

我有一个包含 2 个状态(s0 和 s1)和 1 个子状态机(subm1)的状态机(myStateMachine)。

子状态机 subm1 包含初始状态“sub0”和 s1(与 myStateMachine 中的状态相同)。

这是主要的转换表:

事件 'ES1' 上的 s0->s1

事件 'ES2' 上的 s0->s2

事件 'ESUB' 上的 s0->subm1

这是submachine转换表:

事件“ES1”上的 sub0->s1

现在,假设状态 s1 正在使用触发它的事件来提取一些信息,即

所以每个可以转换到 s1 的事件都需要实现 getEventData() 方法。

-> 这是正常的!

现在我的问题是 ESUB 没有实现 getEventData() 但显然它应该(编译器给出错误)。我不明白为什么。

我没有使用 ESUB 转换到 s1,但我正在使用 ESUB 转换到 subm1,并且 subm1 包含 s1,但那时我没有访问它。

我希望这很清楚。