问题标签 [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.
boost-msm - 使用 boost::msm eUML,如果我将 attributes_ << 赋予状态机或状态,我该如何(重新)设置它们?
如果我向事件添加属性,我知道我可以像使用函数一样使用事件名称......
并且在一个动作中我可以通过写
现在,如果我为整台机器设置一个属性,如下所示:
如何为 someAttribute1 设置值?
对州同样的问题:
如何为 someAttribute1 设置值?
最后,
有没有办法在创建对象后更改属性?
例如,我想为状态机设置一个属性,并且在我的一个状态中,记住一些我可以存储在状态机中的信息。(在这种情况下,我想存储一个套接字。)
谢谢。
c++ - 通过boost元状态机后端访问前端
由于某些原因,我无法通过构造函数设置状态机的参数,所以我想通过后端访问元状态机的公共成员函数。也就是说,我想要类似的东西
这可能吗?谢谢
另一种解决方案是通过事件将参数传递到状态机。
c++ - boost msm - 提升 msm 多个延迟事件
假设我有 2 个状态,一个 Active 状态和一个 Idle 状态。如果我收到一些处于活动状态的事件,我想推迟它们并在我回到空闲状态时执行它们。
但是当我回到空闲状态时,有没有办法选择要处理的先前延迟的事件?或者有没有办法优先考虑它们,甚至忽略其中的一些?
谢谢,
c++ - boost::msm - 一种获取状态的字符串表示(即 getName)的方法?
我正在尝试使用 boost::msm 库在我的代码中创建状态机。有谁知道获取状态的字符串名称(不是 int id)的方法?我正在尝试将此用于日志记录/调试目的。例如在 no_transition 函数中,我得到了状态 id,但我正在尝试获取一个名称,以便于阅读:
以下是我定义事件和状态的方式: 状态:
事件:
任何想法都会很棒。谢谢!
boost - Boost msm 中的线程安全
我是提升元状态库的新手。我正在构建一个应用程序,我必须在其中使用 msm。
我的应用程序有两个线程,它们使用相同的 msm 对象作为共享资源。现在,如果两个线程都在同一个 msm 对象上调用 process_event,那么 msm 会是线程安全的吗?
欢迎任何想法。
c++ - boost::msm 中的状态 ID
在 boost::msm 的教程中,有一个例子展示了我们如何检查当前状态。
作者使用数组state_names
。但是我没有找到如何确定状态顺序的解释。当然我可以猜到它是转换表的“开始”列中的状态顺序。但是,如果某些州不在“开始”列中怎么办?
state - 具有升压状态图的周期性状态机
我想实现一个状态机,它会定期监控一些状态数据(我系统的状态)并对其做出反应。
对于状态机来说,这似乎是非常基本的事情(我以前曾多次遇到过这个问题),但我找不到一个好的方法来做到这一点。这是一些伪代码来解释我想要实现的目标:
当然最重要的是,我希望能够在进入和退出状态时执行一些操作,也许在状态的每次迭代中执行一些操作,有子状态、历史等。这就是为什么这种简单的方法很快变得不切实际的原因,因此提升状态图。
我已经考虑了一些解决方案,我想得到一些反馈。
1)我可以列出我所有的转换条件并为每个条件创建一个事件。然后我会有一个循环来监控每个布尔切换的时间。例如,对于我的第一个条件,它可能是:
但似乎很快就会变得困难
2) 有一个所有状态都响应的事件。只要有一些新的状态数据可用,就会发布此事件。结果,当前状态将检查数据并决定是否启动到另一个状态的转换
3) 让所有状态都继承自定义 do_work(const MyData & data) 方法的接口,该方法将在循环中从外部调用,检查数据并决定是否启动到另一个状态的转换
另外,我愿意使用另一个框架(即 Macho 或 boost MSM)
boost - Boost MSM,尽管 boost::any 被用作事件,但不会发生转换
我正在使用 boost MSM 框架开发状态机。他们的教程指出boost::any可以用作“Kleene 事件”,如果当前状态是源状态,则允许在任何被触发的事件上进行转换。然而,这对我不起作用。我刚刚收到“no_transition”。这是我的示例代码:
执行时,它会产生以下输出:
进入:State1
在事件 N12_GLOBAL__N_110some_eventE 上没有从状态 0 转换
离开:State1
进入:State2
我希望在“some_event”上发生从“State1”到“State2”的转换,但这显然不会发生。
我一定错过了什么,但我无法意识到它是什么。
boost-msm - 提升 MSM 伪退出状态
我正在创建一个 Boost MSM 状态机,其中一些状态有自己的子状态机。根据 Boost 示例,我创建了一个正交区域,它允许从任何地方发布错误事件以终止状态机。
在我尝试从我的一个子状态机发布错误事件之前,这一直很好。什么也没发生,似乎我需要使用伪退出状态将错误事件转发到父状态机。这最初是有效的,但是当我添加了更多的伪退出状态来处理来自每个子状态机的错误时,一段时间后就会发生编译器错误。也无法确定它,可以有 1 或 2 个伪退出状态,但最终它会中断。我在每个子状态机中没有超过 7 个转换,在父状态机中有 9 个。每个子状态机包含 2 或 3 个子状态,父状态机有 6 个。
有谁知道为什么会发生这种情况?我尝试过交换转换,但似乎没有特定的条目是错误的。看不出为什么会发生冲突,因为状态名称是由父类限定的。是不是因为即使我有不同的事件触发它,您也应该只有一个伪退出?或者它只是我的编译器?
这是错误:
有任何想法吗?谢谢。
class - 在 boost::msm 基本状态机中寻找多态性的例子
我是 C++ 新手,提升和使用状态机。有人知道多态 boost::msm 状态机的例子吗?
我试图在提供的基本示例中将转换操作更改为虚拟,但链接器说:
未定义对“DerivedClass 的 vtable”的引用
编辑:错误是通过分析代码解决的基本且无聊的包含/定义错误。
再次仔细阅读基础示例后,我意识到要使其具有多态性,我应该在子类中定义后端并从前端继承。
下面的源文件定义了一个多态基本 msm:
- 花是没有状态的死对象
- FlowerMSM 是状态机(一种将 MSM 行为赋予 Flower 的方法)
- LiveFlower 从两者继承并覆盖来自 FlowerMSM 的转换操作
活花.cpp
花MSM.cpp
为了完整起见,“死”花类: Flower.hpp
编辑: 不接受我自己的答案,以防有人提出更好的解决方案。