问题标签 [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 投票
2 回答
78 浏览

uml - 状态机如何处理包含值的事件(如楼层号)?

我正在玩http://boost-experimental.github.io/msm-lite/tutorial/index.html(标签用于 boost-msm,因为 msm-lite 没有标签,但类似的问题适用),我有设计具有许多可能输入的状态机的问题。

想象一下,您正在为电梯建模。除了像移动、停止、door_open、door_close 这样的明显状态之外,我想知道如何模拟按钮按下(这是一个从 -2 到 39 的数字),因为拥有这么多事件是不可行的(每个按钮按下 42 个)。

0 投票
1 回答
946 浏览

c++ - 使用信号处理程序触发事件时,如何让 boost.msm 正确更改状态?

当使用信号处理程序触发事件时,我的 ( boost.msm) 状态机似乎“回滚”。但是,当我使用直接调用来触发事件时,状态机的行为正确。

我查看了 boost 文档并搜索了网络,但似乎所有示例都使用直接调用来触发事件。我也搜索了 SO,但找不到任何解决此主题的内容。

我正在学习 boost 元状态机库,看看是否可以替换我的开发团队目前使用的现有“本土”状态机库。

为了使其工作,我需要能够从信号处理程序(处理来自 的信号boost.signals2)触发状态机事件。

我创建了一个简单但人为的示例来对其进行测试运行,当我看到在第一个事件被触发后,状态机正确(但暂时)改变了状态(在信号处理程序中)但显然“滚动”时,我感到很困惑返回'后返回主。

当我绕过信号处理程序(通过使用对 process_event 的直接调用)时,一切正常。

无可否认,测试状态机旨在做到这一点:

我想知道如何使用信号处理程序正确触发状态机事件来使这个设计(或类似的东西)工作。使用直接呼叫对我来说不是一种选择,因为我只接收到可以使用的信号。

我在下面包含了测试代码。请注意,main 函数的前半部分练习信号处理程序触发,而 main 函数的后半部分练习直接调用触发(使用 编译g++ main.cpp -omain' or 'clang++ main.cpp -omain):

这是输出:

我通过对输出文件进行后处理添加了行号,以便于参考。

输出的第 01 行显示状态机正确地从初始伪状态转换为 state_a。

输出的第 14 行显示状态机在 on_sa_event 函数内部正确地从 state_a 转换到 state_b。

但是,第 17 行显示状态机在从 main (!) 测试时返回到 state_a

对于信号处理程序测试的剩余转换(第 18-41 行),状态机保持在 state_a 中,导致一些“无转换”错误消息。

对于直接调用练习(输出第 42-65 行),状态机在所有状态中正确转换,并且在触发函数内部和在 main 中(在触发函数调用之后)它的“当前状态”没有区别。

环境:操作系统:“Ubuntu 16.04 LTS”

g++ 版本:(Ubuntu 5.3.1-14ubuntu2)5.3.1 20160413

升压版本:boost_1_60_0

0 投票
2 回答
1223 浏览

c++ - 如何动态创建状态机

我还不知道如何使用 boost msm 动态创建 FSM,例如读取描述机器的模板 XML 文件。知道如何解决这个问题吗?我想在 boost msm 1.61 中使用仿函数方法。

我已经取得了一些进展,因此我可以用常见的方式为前端创建一个基类:

但是,状态机本身是由后端控制的,到目前为止,我看不到在运行时选择后者(例如使用

)。

0 投票
1 回答
841 浏览

state - boost msm submachine current_state 用于访问子状态

知道如何使用 boost msm 1_60 获得子机的 current_state(s) 吗?考虑下面的代码,描述了一个外部状态机,它允许在两个不同的交通信号灯之间进行选择(例如标准的红色、黄色、绿色和另一个交替的两个黄灯):

};

现在,我可以通过

但是我怎样才能得到 RYG 子机的当前状态呢?

仅返回 1(因为这是外部状态机 BigMom 的状态...)...

感谢帮助!

0 投票
1 回答
1351 浏览

c++ - 带有 Boost MSM 的分层状态机

这是给那些有 Boost MSM 经验的人的问题。我有一个用 Boost MSM 实现的非常大的状态机,最后今天我用完了向量限制 50(有太多事件进入我的状态机,这是无法避免的)。我创建了更高的向量头(vector60、vector70 等),但我想将我的状态机作为一个整体进行压缩。

问题是,MSM 是否支持分层状态机。例如(如果我错了,请纠正我),在分层状态机中,如果某个事件未在特定状态下处理,则该事件将被转发到当前状态的父状态等。

作为减少转换表大小的一部分,我希望创建一个父状态,其中将处理具有公共处理程序的事件,从而减少转换表大小。

任何建议/意见表示赞赏。

谢谢

0 投票
1 回答
436 浏览

c++11 - Boost Meta State Machine Infinite Loop Seg Fault

我正在尝试使用 Boost 状态机,但在无限循环中运行我的机器时遇到了分段错误。本质上,我在下面显示的 boost 状态机仿函数示例中有相同的示例:

在此处输入图像描述

唯一的区别是我现在一进入 State4 就触发“event1”发生,因此创建了一个循环。这适用于数千次迭代,但随后会出现段错误。我是否违反了某种 UML 规则并溢出了堆栈?我基本上只有一个阻塞事件,然后我希望所有其他状态自动触发,然后以 State4 结束(例如,这实际上是等待来自网络的消息的阻塞调用)。我将如何使用元状态机正确实现这一点,这样我就不会炸毁堆栈?

更新
我在这里包含了导致我的问题的源代码:http: //pastebin.com/fu6rzF0Q

这基本上是仿函数前端的示例,除了以下更改:

添加了“假装”阻塞调用功能:

我还更新了转换表中的最后一行:

请注意,不再需要触发从 State4 移动到 State1 的事件。毫无疑问,这段代码会给你一个段错误,并且会有一个长达 1000 行的堆栈跟踪。

我还应该注意,无论我等待多久,我总是最终会出现段错误。我已经尝试将 sleep 更改为 1 - 100,它最终会死掉。我想我需要某种方式在单个循环完成后展开堆栈。

更新 2 所以我发现当我在无限循环中触发事件时我没有段错误。这是我所做的:

首先,我将转换表设置回原始示例:

然后我将主程序更改为以下内容:

现在我一直在全速运行(没有睡眠)并且我没有出现段错误。基于此,似乎没有办法启动状态机并让它运行并处理内部事件,对吗?我总是必须在外部有一些至少触发的过程?

更新 3 最终我的目标是实现如下图所示:

我的意图是启动状态机,然后它会简单地等待传入消息而无需任何进一步的干预。

0 投票
1 回答
1240 浏览

c++ - 通过延迟的自转换来提升 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)of实现什么unistd.h)更好的解决方案?我的感觉是,我没有尝试与 Boost.MSM 一起使用的 pthread 将是一个更通用/更少约束的实现?
  2. 我不清楚createandprocess方法是如何工作的(为什么create函数需要可变参数模板?)。std::forward特别是,我以前没有使用过智能指针或理解这段代码)。
  3. 与 2 一起,更好地解释 thewpios成员变量的用途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);不改变行为的情况下删除该行 - 它是多余的吗?
0 投票
1 回答
1634 浏览

c++ - BOOST::MSM 检查保护条件下的状态转换

我有一个通用的保护条件,我想在某些情况下有条件地阻止转换。下面是我想做的有点 C++/伪代码。

我想知道目标状态是否与源状态不同,并据此确定我们是否可以允许基于其他参数的转换。到目前为止,我还没有在文档方面取得很大成功。

0 投票
1 回答
673 浏览

c++ - Boost::msm 如何使用非默认构造函数初始化 state_machine_def 和 msm::front::state

我有一个看起来像这样的状态机:

如何fsmFsmDef. State1 也一样。

0 投票
0 回答
152 浏览

boost - boost statechart:它还维护吗?

我目前在我的一个项目中使用 boost::state_chart。由于更改日志 [1] 显示了 boost 1.46.0 中的最后一个活动,它是否仍然保持不变,或者我应该切换到 boost::MSM?

[1] http://www.boost.org/doc/libs/1_64_0/libs/statechart/doc/future_and_history.html#ChangeHistory