寻求支持UML‘do activity’的C/C++状态机库及解决方案
关于C++状态机库UML 'do activity'机制的需求与疑问
我在GitHub上查找了Boost、tinyFSM等C++状态机(FSM、HSM等)库,发现这些库均未实现UML的do activity机制,仅支持事件触发状态转换时执行单次动作(如fsm.process_event(Event{}))。这里的activity指可被事件中断的长时动作(类似线程内执行的任务),但我不需要真实的std::thread,而是需要一个tick()(又称on_running())方法,能在并发场景下被状态类调用。
我的思路伪代码如下:
struct State1 { void on_running() { ... // 阻塞但响应迅速的代码 } }; FSM fsm; // + 转换表初始化 void threaded_routine() { fsm.process_event(Event1{}); } int main() { fsm.process_event(Event2{}); while (true) { fsm.tick(); // 会调用fsm.current_state.on_running(),在这个方法里我可以最终调用fsm.process_event(Event3{}); } }
我有此需求的原因是需要集成一个提供.tick()更新方法的库。
注:在UML中,状态自转换时不会调用
on_entering和on_leaving动作(Boost中通过构造/析构函数实现),因此我不确定在Boost中添加同状态间带动作的转换能否模拟on_running()方法。
关于Boost Statechart的相关说明:
Do activity - Not supported in Boost.Statechart - A do activity can be simulated with a separate thread that is started in the entry action and cancelled (!) in the exit action of a particular state
目前我尝试过itemis Create,它支持activity,但属于专有工具。
问题
- 是否存在支持activity的C/C++状态机库?
- 为何多数状态机库仅支持事件触发转移动作?
- 是否有同类需求的开发者已解决该问题?
- 能否提供基础实现示例?
内容的提问来源于stack exchange,提问作者Lecrapouille
相关产品推荐
相关产品推荐

