我的主SM中有两个子SM。我希望能够跳入主SM中的任何一个,但也从一个子SM跳到另一个SM。但我不能。我能够从主SM跳转到子SM并从子SM的一个跳到另一个,但是当我在子SM之间添加“相互”转换时,编译失败了~10错误抱怨不同的事情。我想这是因为编译器进入递归旋转。
我想我可以在主SM中添加一个虚拟状态,并匿名过渡到目标子SM。但后来我会松开触发过渡的真实事件,我不想要它(它包含数据)。
这是一些测试代码,其中有违规行被注释掉
set.seed(486)
date <- rep(seq(as.Date("1985-01-01"), as.Date("2010-01-1"), by="weeks"), each=3)
N <- length(date)
name <- c("A","B","C")
value <- rnorm(N)
i<-which(value %in% sample(value, 25)) ;i
j<-which(value %in% sample(value, 150)) ;j
value[i] <- NA
value[j] <- 0
data1 <- data.frame(date, name, value)
答案 0 :(得分:1)
我假设您不想在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找到关于伪退出状态的良好资源。