问题标签 [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.
uml - 状态机如何处理包含值的事件(如楼层号)?
我正在玩http://boost-experimental.github.io/msm-lite/tutorial/index.html(标签用于 boost-msm,因为 msm-lite 没有标签,但类似的问题适用),我有设计具有许多可能输入的状态机的问题。
想象一下,您正在为电梯建模。除了像移动、停止、door_open、door_close 这样的明显状态之外,我想知道如何模拟按钮按下(这是一个从 -2 到 39 的数字),因为拥有这么多事件是不可行的(每个按钮按下 42 个)。
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
c++ - 如何动态创建状态机
我还不知道如何使用 boost msm 动态创建 FSM,例如读取描述机器的模板 XML 文件。知道如何解决这个问题吗?我想在 boost msm 1.61 中使用仿函数方法。
我已经取得了一些进展,因此我可以用常见的方式为前端创建一个基类:
但是,状态机本身是由后端控制的,到目前为止,我看不到在运行时选择后者(例如使用
)。
state - boost msm submachine current_state 用于访问子状态
知道如何使用 boost msm 1_60 获得子机的 current_state(s) 吗?考虑下面的代码,描述了一个外部状态机,它允许在两个不同的交通信号灯之间进行选择(例如标准的红色、黄色、绿色和另一个交替的两个黄灯):
};
现在,我可以通过
但是我怎样才能得到 RYG 子机的当前状态呢?
仅返回 1(因为这是外部状态机 BigMom 的状态...)...
感谢帮助!
c++ - 带有 Boost MSM 的分层状态机
这是给那些有 Boost MSM 经验的人的问题。我有一个用 Boost MSM 实现的非常大的状态机,最后今天我用完了向量限制 50(有太多事件进入我的状态机,这是无法避免的)。我创建了更高的向量头(vector60、vector70 等),但我想将我的状态机作为一个整体进行压缩。
问题是,MSM 是否支持分层状态机。例如(如果我错了,请纠正我),在分层状态机中,如果某个事件未在特定状态下处理,则该事件将被转发到当前状态的父状态等。
作为减少转换表大小的一部分,我希望创建一个父状态,其中将处理具有公共处理程序的事件,从而减少转换表大小。
任何建议/意见表示赞赏。
谢谢
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
最终我的目标是实现如下图所示:
我的意图是启动状态机,然后它会简单地等待传入消息而无需任何进一步的干预。
c++ - 通过延迟的自转换来提升 MSM 并行行为?
我正在使用 Boost MSM(基本和仿函数前端)并尝试实现以下状态机:
用一句话来说:
- 进入状态 State1
- 进入状态A并执行action_A。2 秒后,打印“再次尝试...”并重新执行状态 A(即调用其进入动作)。这永远循环......
- 与2同时(即“并行”),进入状态B,执行action_B。5 秒后,打印“再次尝试...”并重新执行状态 B(即调用其进入动作)。这永远循环......
我想知道在 Boost MSM 中创建这个状态机的方法。这里有两个技巧我不知道该怎么做:
- 并行执行(即运行action_A不会同时停止运行action_B)
- 延迟转换(即状态 A 2 秒后发生的转换,状态 B 5 秒后发生的转换)。任何延迟都不应该阻塞!在这段时间之后,转换应该只是“触发”。
非常感谢您的帮助。
编辑
@TakatoshiKondo 答案可以满足我的需要,但我想对答案的某些部分进行更多解释,以便完全理解它。
- 这与 pthreads 实现相比如何?您认为 Boost.Asio 是否比将状态 A 和 B 放入不同的线程并在每个线程中进行阻塞、被动等待(例如可以通过
usleep(useconds_t usec)
of实现什么unistd.h
)更好的解决方案?我的感觉是,我没有尝试与 Boost.MSM 一起使用的 pthread 将是一个更通用/更少约束的实现? - 我不清楚
create
andprocess
方法是如何工作的(为什么create
函数需要可变参数模板?)。std::forward
特别是,我以前没有使用过智能指针或理解这段代码)。 - 与 2 一起,更好地解释 the
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);
不改变行为的情况下删除该行 - 它是多余的吗?
c++ - BOOST::MSM 检查保护条件下的状态转换
我有一个通用的保护条件,我想在某些情况下有条件地阻止转换。下面是我想做的有点 C++/伪代码。
我想知道目标状态是否与源状态不同,并据此确定我们是否可以允许基于其他参数的转换。到目前为止,我还没有在文档方面取得很大成功。
c++ - Boost::msm 如何使用非默认构造函数初始化 state_machine_def 和 msm::front::state
我有一个看起来像这样的状态机:
如何fsm
为FsmDef
. State1 也一样。
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