状态机的执行顺序,包括action,on_entry,on_exit和自转换等

前言

在使用状态机时,在进行状态转换的时候会进行一些相应的操作,包括action,on_entry和on_exit等,这个顺序是比较重要的,在此做一些记录,拯救一下岌岌可危的记性。

范例 自转换

namespace {
	class idle;
	class test;
	struct event1 {};
	struct event2 {};
	struct event3 {};

	struct error_handling {
		auto operator()() const {
			using namespace sml;
			// clang-format off
			return make_transition_table(
				* state<idle> + event<event3> /[] {std::cout << 2 << std::endl; } = state<test>
				, state<idle> + event<event1> /[] {std::cout << 3 << std::endl; }
				, state<idle> + on_exit<_> / [] {std::cout << 4 << std::endl; }
				, state<idle> + on_entry<_> / [] {std::cout << 5 << std::endl; }
				, state<test> + on_entry<_> / [] {std::cout << 6 << std::endl; }

			);
			// clang-format on
		}
	};
}  // namespace

int main() {
	using namespace sml;
	sm<error_handling, sml::dispatch<sml::back::policies::jump_table>> sm;

	sm.process_event(event1{});  
}

关于event1,这是idle状态的自转换,一开始的构想是会先执行idle的on_exit操作,然后再执行event1的action,也就是说输出为4,3 。先看结果如下:
在这里插入图片描述
其实是先执行了idle的on_entry 然后执行action,不执行on_exit 。

范例 转换

来看看转换event3的时候的执行顺序。

sm.process_event(event1{}); 

结果如下
在这里插入图片描述
构想与预期一致,只是需要注意的是每次都会调用idle的on_entry操作,这一点需要注意。

在这里插入图片描述
执行逻辑如上图所示,一时间没找到画图软件就草草手绘了个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值