问题标签 [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 回答
572 浏览

c++ - 为什么 boost::msm::front::state_machine 的转换表最多只能支持 10 个状态?

我正在尝试设置自己的状态机,其中包含多个状态、防护和操作,但是当转换表中的状态数量超过 10 个状态时,会弹出大量错误消息,但我仍然无法从中推断出错误的来源。我已将我的代码简化如下:

如果我只有状态 J 的所有转换,转换表就可以工作,但是一旦我添加了从 J 到 K 的转换,编译器就会抛出一个错误,覆盖 20,000.+ 行。我的问题是:

如何在转换表中插入超过 10 个状态、警卫和动作而不产生任何错误?

先感谢您!

编译器错误信息:

0 投票
1 回答
75 浏览

uml - boost MSM 如何定义两个子状态之间的转换?

我正在使用 Boost 1.64.0 MSM 库来生成分层状态机。为了测试转换机制,我实现了一个这样的状态机

那么如何定义从 S11 到 S21 的转换,根据wiki 中描述的相同情况,转换执行顺序应该是 'exit S11' -> 'exit S1' -> 'enter S2' -> 'enter S21'。

0 投票
1 回答
393 浏览

c++ - 提高 MSM 编译速度

我试图通过使用 boost MSM 状态机的显式模板实例化来减少项目的编译时间。但是,每当我添加显式模板实例化时,我的项目都不会编译。

您可以使用此处文档中的示例找到问题的示例:http: //coliru.stacked-crooked.com/a/9850cae23afdada2。(这是一个人为的例子,因为只有一个翻译单元,但错误与我在项目中使用显式模板实例化时的错误相同。)

有谁知道如何解决这些编译错误?

0 投票
1 回答
587 浏览

c++ - 如何将 boost::msm 状态机的实现传播/拆分为多个文件?

我想将 boost::msm 状态机的实现拆分为多个文件。我正在寻找类似的东西:

1) 每个州一个标题

2)主状态机(最外面的SM)的一个标题但我不知道这个文件应该怎么写

3)使用SM的客户端代码。

我想出的内容如下(无法编译,以以下形式给出错误:“不完整类型的无效使用”和其他错误)。

第一个样本状态:

第二个样本状态:

主要SM:

客户端代码:

感谢任何有关如何将 boost:msm 拆分为多个文件的帮助和提示。

0 投票
1 回答
583 浏览

c++ - How to use forward declaration with boost::msm to avoid circular dependency?

I am trying to implement a simple protocol with boost::msm. As packets arrive they are processed and dispatched to the State Machine (SM) to be handled accordingly.

My pkt class (i.e. Pkt1) requires a handle to the fsm that would allow it to call fsm->process_event(...) (and of course i would add #include "myfsm.h" to the top of the pkt1.h).

So far so good. But what if my state machine (say State1) requires to react to that packet by sending a packet itself? Now I would include the "pkt1.h" header to the top of the "state1.h" so i could create an instance of the Pkt1 and call its send() function.

Well as you might guess this final inclusion leads to a "circular dependency"

The sample code (with the error) can be found : https://wandbox.org/permlink/IlFsUQyLPLrLl2RW (its my first time using wandbox, hope everything is OK)

Note) In the "state1.h" file remove the #include "pkt1.h" & on_entry(..)... Pkt1 pkt; pkt.send(); to make it compilable.

Questions:

1) How should I resolve this circular dependency?

2) I think the way forward would be to add an implementation file (.cpp) for my Pkt1 class and transfer the #include "myfsm.h" to this file, thus breaking the circular dependency. But how can I forward declare the MyFsm in the header file?

3) I am new to boost::msm/CRTP and the code is confusing to me. How can State1 get access to MyFsm while I have not included the corresponding header to state1.h?? (maybe because MyFsm derives from the functor front/back end which its header is included and allows virtual functions to call the corresponding MyFsm functions!!??)

Many thanks for your time and help in advance.

Code Included:

  • events.h

    /li>
  • main.cpp

    /li>
  • myfsm.h

    /li>
  • pkt1.h

    /li>
  • state1.h

    /li>
  • state2.h

    /li>
0 投票
1 回答
493 浏览

c++ - 如何在 boost::msm 中实现“BaseState”并访问状态机 (SM) 的后端/前端

我想在状态之间以及整个 SM 和客户端代码(即 SM 之外的代码)之间共享数据和访问。

根据我在网上提出的建议,最好的方法是从基类继承所有状态。

添加基类并使所有状态和 SM 从中继承很简单,但是如何将处理程序添加到 SM 的后端/前端作为该基类的成员,如何初始化它?

示例代码可以编译,但在访问 SubState 中设置的 fsmHandler 时会崩溃(SubState 通常无法访问根 fsm)!

问题:

如何访问根 SM 及其在 SM 层次结构深处的子机中的数据?

Q1) 如何解决运行时错误?

Q2) 我如何将数据从客户端代码(在 SM 之外)传递到 SM 感觉不对!有没有更好的方法来做到这一点?它是线程安全的吗?

Q3)我怎样才能typedef StateBase_<MyFsm_> StateBase编译。

如果您能提供一个工作样本,我将不胜感激。提前感谢您的时间和帮助。

编码:

主文件

我的文件

0 投票
1 回答
209 浏览

c++ - 如何退出拆分为多个文件的分层 SM 中的子机?(使用升压::MSM)

有一个很好的教程解释了我们如何使用“exit-pseudo-state”从子机中退出boost::MSM在这里

但是我需要将我的 SM 拆分为多个文件,以使其易于管理,这就是问题所在。

当在主 fsm 文件中定义子 SM 时,一切正常,即从“退出伪状态”退出导致从子 SM 退出到下一个状态(示例代码

在单独的文件中实现子 SM,我必须在其中进行额外级别的虚拟继承,这会导致问题。这次内部子 SM 中到退出伪状态的转换不会触发父 SM 中到下一个状态的退出。是显示问题的示例代码。

从下面的输出中可以看出,State2::on_exit()退出 substate21 后最后缺少

提前感谢您的帮助

代码包括:

主文件:

主fsm:

子 SM 即 state2.h:

0 投票
1 回答
501 浏览

c++ - 如何确定特定状态在 boost-msm 中是否处于活动状态?

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

我想到了以下伪代码:

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

0 投票
1 回答
53 浏览

boost - 如何重用父 SM 中子机中定义的代码(Guard)(使用 boost-msm)?

我已经在子状态机中定义了一个保护,现在我想在父 SM 中使用确切的逻辑/保护(使用 boost-msm)。在 transition_table 中使用相同的保护会导致编译错误:未知类型名称“GuardSS”。

我已经在子机中定义了守卫(及其对应的值),但如果它有助于解决问题并允许我重用守卫,则可以将其移至父 SM。

可以在此处找到示例代码。

如何重用守卫中使用的代码?

代码包括:

fsm.h:

0 投票
0 回答
151 浏览

qt - QStateMachine 自动转换或混合 boost::msm 与 QObject

我对 C++ 和 Qt 很陌生,我想开发一种机器控制并通过状态机对过程进行建模。到目前为止,我将我的代码分成不同的 QObjects,这些 QObjects 在不同的 QThreads 中运行,它们通过 QTs 信号/插槽概念进行通信。到目前为止,我一直在使用 QStatemachine 框架,但我怀疑我是否以正确的方式使用它。例如,我创建了一个简单的 StateMachine:

*。H:

*.cpp:

在这种情况下,我必须为我的 FSM 中的每个转换声明一个信号,并为每个状态声明一个插槽,并相应地连接它们。这在像上面这样的小例子中可能没问题,但如果 FSM 可能包含超过 100 个状态,则会很快变得混乱。

  1. 有没有办法使用无条件转换?例如sA->addTransition(sB),这意味着 sA 将自动转换为 sB。但是,如果我尝试使用它,它会破坏我的 QStateMachine。如果这是不可能的:
  2. 我对 Boost MSM 框架进行了一些研究,并且喜欢提供的语法和功能(转换表、“无”事件等)。是否有适当的方法将 boost::msm 嵌入 QObject 并能够在on_entryboost::msm 的函数中发出该 QObject 的信号?