- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的主 SM 中有两个子 SM。我希望能够从主 SM 跳入任何一个,但也可以从一个子 SM 跳入另一个 SM。但我不能。我可以从主 SM 跳转到子 SM,也可以从 一个 子 SM 跳到另一个,但是当我在子 SM 之间添加“相互”转换时,编译失败并显示 ~10错误提示不同的事情。我想那是因为编译器进入了递归循环。
我想我可以在主 SM 中添加一个虚拟状态,并匿名转换到目标子 SM。但随后我会丢失触发转换的真实事件,而我不希望这样(它包含数据)。
下面是一些测试代码,其中有问题的行被注释掉了
#include <iostream>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>
namespace {
using namespace boost::msm;
using namespace boost::msm::front;
namespace mpl = boost::mpl;
struct EvGotoSub1 {};
struct EvGotoSub2 {};
struct MainSM_;
using Main = back::state_machine<MainSM_>;
struct Sub1SM_;
using Sub1 = back::state_machine<Sub1SM_>;
struct Sub2SM_;
using Sub2 = back::state_machine<Sub2SM_>;
struct Sub1SM_ : state_machine_def<Sub1SM_> {
struct Started : state<> { };
using initial_state = mpl::vector<Started>;
struct transition_table:mpl::vector<
Row<Started, EvGotoSub2, Sub2, none, none>
> {};
};
struct Sub2SM_ : state_machine_def<Sub2SM_> {
struct Started : state<> { };
using initial_state = mpl::vector<Started>;
struct transition_table:mpl::vector<
// Uncomment line below to break things
//Row<Started, EvGotoSub1, Sub1, none, none>
> {};
};
struct MainSM_ : state_machine_def<MainSM_> {
struct Started : state<> { };
using initial_state = mpl::vector<Started>;
struct transition_table:mpl::vector<
Row<Started, EvGotoSub1, Sub1, none, none>,
Row<Started, EvGotoSub2, Sub2, none, none>
> {};
};
}
int main() {
Main main;
main.start();
main.process_event(EvGotoSub1());
main.process_event(EvGotoSub2());
main.process_event(EvGotoSub1());
}
最佳答案
我假设您不想将 Sub2
嵌套在 Sub1
中,反之亦然,但两者都是 Main
的子机器,无需任何嵌套。您可以使用 pseudo exit states 从一台子机退出并转到另一台.
这些退出状态只是转发传入的事件,然后您可以通过在 Main
的转换表中定义额外的转换将其传递给其他子机:
#include <iostream>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>
namespace {
using namespace boost::msm;
using namespace boost::msm::front;
namespace mpl = boost::mpl;
struct EvGotoSub1 { EvGotoSub1(int d1):d1(d1){} int d1;};
struct EvGotoSub2 { EvGotoSub2(int d2):d2(d2){} int d2;};
struct MainSM_;
using Main = back::state_machine<MainSM_>;
struct Sub1SM_;
using Sub1 = back::state_machine<Sub1SM_>;
struct Sub2SM_;
using Sub2 = back::state_machine<Sub2SM_>;
struct Sub1SM_ : state_machine_def<Sub1SM_> {
struct Started : state<> { template <class Event,class Fsm> void on_entry(const Event& e, Fsm&) const { std::cout << "SUB2SM_ Started::on_entry(): d1="<<e.d1 << std::endl; } };
struct Exit : exit_pseudo_state<EvGotoSub2> {};
using initial_state = mpl::vector<Started>;
struct transition_table:mpl::vector<
Row<Started, EvGotoSub2, Exit, none, none>
> {};
};
struct Sub2SM_ : state_machine_def<Sub2SM_> {
struct Started : state<> { template <class Event,class Fsm> void on_entry(const Event& e, Fsm&) const { std::cout << "SUB2SM_ Started::on_entry(): d2="<<e.d2 << std::endl; } };
struct Exit : exit_pseudo_state<EvGotoSub1> {};
using initial_state = mpl::vector<Started>;
struct transition_table:mpl::vector<
Row<Started, EvGotoSub1, Exit, none, none>
> {};
};
struct MainSM_ : state_machine_def<MainSM_> {
struct Started : state<> { };
using initial_state = mpl::vector<Started>;
struct transition_table:mpl::vector<
Row<Started, EvGotoSub1, Sub1, none, none>,
Row<Started, EvGotoSub2, Sub2, none, none>,
Row<Sub2::exit_pt<Sub2SM_::Exit>, EvGotoSub1, Sub1, none, none>,
Row<Sub1::exit_pt<Sub1SM_::Exit>, EvGotoSub2, Sub2, none, none>
> {};
};
}
int main() {
Main main;
main.start();
main.process_event(EvGotoSub1(0));
main.process_event(EvGotoSub2(1));
main.process_event(EvGotoSub1(2));
}
实例:http://coliru.stacked-crooked.com/a/d491442b38a24e82
可以看到,事件没有丢失而是转发了。
可以在 http://redboltz.wikidot.com/exit-point-pseudo-state 找到有关伪退出状态的良好资源。 .
关于c++ - 在 boost::msm 中的子 SM 之间跳转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30914719/
假设我有 2 个状态,一个事件状态和一个空闲状态。如果我在 Active 状态下收到一些事件,我想推迟它们并在我返回 Idle 状态时执行它们。 但是当我回到空闲状态时,有没有办法选择要处理哪个先前延
我有一个像这样的状态机: class FsmDef : public boost::msm::front::state_machine_def { private: Args args;
我是 boost 元状态库的新手。我正在构建一个应用程序,我必须在其中使用 msm。 我的应用程序有两个线程,它们使用相同的 msm 对象作为共享资源。如果两个线程都在同一个 msm 对象上调用 pr
我有一个实时循环,我需要根据我所处的状态进行每次迭代的工作。 我正在使用 Boosts Meta State Machine 库来实现我的状态机。根据我所处的状态调用函数的最佳方法是什么? 假设我有一
我想知道是否有一种方法可以直接安装msm而不需要创建另一个安装项目? 最佳答案 这是不可能的。 MSM 包的目的是共享资源,例如 VC++ 可再发行组件,您可以将其包含在应用程序的安装程序中,例如先决
我有一个更大的站点,它使用 MSM 分成子域。这些站点中的每一个都有自己的一组员工来管理该部分。我的想法是创建成员组来反射(reflect)这些员工组,并为他们分配对每个子域的适当访问权限。每个子域都
我尝试使用 boost::MSM 实现一个简单的状态机以进行测试。有几个事件必须按正确的顺序处理,所以我推迟了目前不允许的其他事件。我尝试推迟转换表中的事件,以便在一个地方寻找它,尽管要查看所有状态,
在 boost::msm 的文档中有一个 example没有默认构造函数的状态机。我可以让它在我直接从 super SM 跳到子 SM 的地方工作。但是当我从一个子 SM 跳转到另一个子 SM 时,目
我的问题更像是一个架构问题。我有多个相同类型的状态机。说 controller_type1_sm controller1; controller_type2_sm controller2; std::
我有一个通用的保护条件,我想在某些情况下有条件地阻止转换。下面是我想做的一些 C++/伪代码。 bool operator()(Event const& evt, FSM & fsm, SourceS
我在使用 boost::msm 实现子子状态机时遇到了一些麻烦。我试图在这里最小化我的代码... 测试.cpp: struct SM_ : StateMachineA {}; // Pick a ba
以下代码是仿函数前端的 boost msm 文档中给出的示例。 #include #include // back-end #include //front-end #include //
网络上的任何地方似乎都没有关于如何执行此操作的分步过程记录。如果提到它,它的文档记录很差,我无法遵循他们建议的复杂路径。我是 ClickOnce 的新手,我已经能够让我的 c# 程序在用户机器上正确安
我想使用 boost msm 状态机,但我很难想象它是如何工作的。假设我们只有 2 个状态(s1,s2),要从 s1 到 s2,您需要触发事件 e1 并返回,您需要另一个 e2。e1 和 e2 只能分
我正在使用新的 Boost 1.44.0 MSM 库来生成状态机。在此状态机中,有两类事件 class1 和 class2。 class1 事件可以由状态 S1 或 S2 处理,而 class2 事件
当我触发 process_event("eventname") 时,如何检查状态转换是否发生或是否调用了 no_transition? 基本上,我希望触发/调用 process_event("even
我使用 MSM 插件在两个不同的域名上运行两个 ExpressionEngine 站点。站点一包含所有系统文件等,站点二位于站点一的子文件夹中。我的问题是如何让站点 2 在 url 中没有它的 ind
我正在使用 Windows Installer XML (WiX) 工具集创建发行版。我想将 Visual C++ Redistributable 添加到包中。这里 http://wix.source
我正在熟悉 MSM boost 库。我发现这真的很有趣 questions关于加入几个正交状态。 此外,我在 boost 文档中找到了一种在父状态机中重用子状态机的方法,并且我编写了几个简单的嵌套状态
我正在使用 Boost MSM 来模拟机器人的行为。有多种状态,如“ManualMove”、“AutoMove”、“Work”、“Idle”等……但是,我需要能够从任何状态强行停止机器人,将其置于无法
我是一名优秀的程序员,十分优秀!