问题标签 [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.
c++ - 为什么 boost::msm::front::state_machine 的转换表最多只能支持 10 个状态?
我正在尝试设置自己的状态机,其中包含多个状态、防护和操作,但是当转换表中的状态数量超过 10 个状态时,会弹出大量错误消息,但我仍然无法从中推断出错误的来源。我已将我的代码简化如下:
如果我只有状态 J 的所有转换,转换表就可以工作,但是一旦我添加了从 J 到 K 的转换,编译器就会抛出一个错误,覆盖 20,000.+ 行。我的问题是:
如何在转换表中插入超过 10 个状态、警卫和动作而不产生任何错误?
先感谢您!
编译器错误信息:
uml - boost MSM 如何定义两个子状态之间的转换?
我正在使用 Boost 1.64.0 MSM 库来生成分层状态机。为了测试转换机制,我实现了一个这样的状态机
那么如何定义从 S11 到 S21 的转换,根据wiki 中描述的相同情况,转换执行顺序应该是 'exit S11' -> 'exit S1' -> 'enter S2' -> 'enter S21'。
c++ - 提高 MSM 编译速度
我试图通过使用 boost MSM 状态机的显式模板实例化来减少项目的编译时间。但是,每当我添加显式模板实例化时,我的项目都不会编译。
您可以使用此处文档中的示例找到问题的示例:http: //coliru.stacked-crooked.com/a/9850cae23afdada2。(这是一个人为的例子,因为只有一个翻译单元,但错误与我在项目中使用显式模板实例化时的错误相同。)
有谁知道如何解决这些编译错误?
c++ - 如何将 boost::msm 状态机的实现传播/拆分为多个文件?
我想将 boost::msm 状态机的实现拆分为多个文件。我正在寻找类似的东西:
1) 每个州一个标题
2)主状态机(最外面的SM)的一个标题但我不知道这个文件应该怎么写
3)使用SM的客户端代码。
我想出的内容如下(无法编译,以以下形式给出错误:“不完整类型的无效使用”和其他错误)。
第一个样本状态:
第二个样本状态:
主要SM:
客户端代码:
感谢任何有关如何将 boost:msm 拆分为多个文件的帮助和提示。
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>
c++ - 如何在 boost::msm 中实现“BaseState”并访问状态机 (SM) 的后端/前端
我想在状态之间以及整个 SM 和客户端代码(即 SM 之外的代码)之间共享数据和访问。
根据我在网上提出的建议,最好的方法是从基类继承所有状态。
添加基类并使所有状态和 SM 从中继承很简单,但是如何将处理程序添加到 SM 的后端/前端作为该基类的成员,如何初始化它?
此示例代码可以编译,但在访问 SubState 中设置的 fsmHandler 时会崩溃(SubState 通常无法访问根 fsm)!
问题:
如何访问根 SM 及其在 SM 层次结构深处的子机中的数据?
Q1) 如何解决运行时错误?
Q2) 我如何将数据从客户端代码(在 SM 之外)传递到 SM 感觉不对!有没有更好的方法来做到这一点?它是线程安全的吗?
Q3)我怎样才能typedef StateBase_<MyFsm_> StateBase
编译。
如果您能提供一个工作样本,我将不胜感激。提前感谢您的时间和帮助。
编码:
主文件
我的文件
c++ - 如何退出拆分为多个文件的分层 SM 中的子机?(使用升压::MSM)
有一个很好的教程解释了我们如何使用“exit-pseudo-state”从子机中退出boost::MSM
,在这里。
但是我需要将我的 SM 拆分为多个文件,以使其易于管理,这就是问题所在。
当在主 fsm 文件中定义子 SM 时,一切正常,即从“退出伪状态”退出导致从子 SM 退出到下一个状态(示例代码)
在单独的文件中实现子 SM,我必须在其中进行额外级别的虚拟继承,这会导致问题。这次内部子 SM 中到退出伪状态的转换不会触发父 SM 中到下一个状态的退出。这是显示问题的示例代码。
从下面的输出中可以看出,State2::on_exit()
退出 substate21 后最后缺少
提前感谢您的帮助
代码包括:
主文件:
主fsm:
子 SM 即 state2.h:
c++ - 如何确定特定状态在 boost-msm 中是否处于活动状态?
在一个状态内完成的处理取决于另一个状态是否处于活动状态。如何确定特定状态在 boost-msm 中是否处于活动状态?
我想到了以下伪代码:
auto state = fsm.get_state<MyFsm_::State_x&>();
bool state_Status = state.isActive();
boost - 如何重用父 SM 中子机中定义的代码(Guard)(使用 boost-msm)?
我已经在子状态机中定义了一个保护,现在我想在父 SM 中使用确切的逻辑/保护(使用 boost-msm)。在 transition_table 中使用相同的保护会导致编译错误:未知类型名称“GuardSS”。
我已经在子机中定义了守卫(及其对应的值),但如果它有助于解决问题并允许我重用守卫,则可以将其移至父 SM。
可以在此处找到示例代码。
如何重用守卫中使用的代码?
代码包括:
fsm.h:
qt - QStateMachine 自动转换或混合 boost::msm 与 QObject
我对 C++ 和 Qt 很陌生,我想开发一种机器控制并通过状态机对过程进行建模。到目前为止,我将我的代码分成不同的 QObjects,这些 QObjects 在不同的 QThreads 中运行,它们通过 QTs 信号/插槽概念进行通信。到目前为止,我一直在使用 QStatemachine 框架,但我怀疑我是否以正确的方式使用它。例如,我创建了一个简单的 StateMachine:
*。H:
*.cpp:
在这种情况下,我必须为我的 FSM 中的每个转换声明一个信号,并为每个状态声明一个插槽,并相应地连接它们。这在像上面这样的小例子中可能没问题,但如果 FSM 可能包含超过 100 个状态,则会很快变得混乱。
- 有没有办法使用无条件转换?例如
sA->addTransition(sB)
,这意味着 sA 将自动转换为 sB。但是,如果我尝试使用它,它会破坏我的 QStateMachine。如果这是不可能的: - 我对 Boost MSM 框架进行了一些研究,并且喜欢提供的语法和功能(转换表、“无”事件等)。是否有适当的方法将 boost::msm 嵌入 QObject 并能够在
on_entry
boost::msm 的函数中发出该 QObject 的信号?