最近在使用stateChart状态机时遇到一些问题,记录一下
简介
1、定义一个继承自state_machine的结构体作为状态机主体,内部可包含一些切换状态机的接口以及响应不同事件的函数
2、定义一系列状态结构体,继承自simple_state或state(若在entry reaction或exit reaction中需要调用部分函数如post_event()等则需继承后者),表示状态机可处的状态以及不同状态中相应的行为
3、定义一系列事件,继承自event,可通过状态机的process_event()和post_event()等来发出事件并调用不同的reaction
entry/exit reaction中不可使用process_event()
entry reaction即为状态构造函数,若需要在该区域发布事件应使用post_event(),另外,虽然在custom_reaction和in_state_reaction中可使用process_event,但推荐使用post_event代替。entry/exit reaction中不可使用transit()
状态正在切换时,不可强行转换状态,若需要在reaction结束后转换状态,推荐使用post_event发布一个事件,并定义相应的transition响应。process_event会等到所有reaction结束才返回
使用process_event发布事件后,会等到所有相应reaction结束后(若某reaction中又发布了新事件,同时会等待新事件所有相应结束)返回。state_machine为非线程安全的
根据上一条,多线程使用process_event,容易造成程序崩溃,需要使用多线程时,应使用异步状态机