给自己开发了一套有限状态自动机类库,满足基本的状态转移需求,有需要的朋友拿去玩吧。

boost库中自动机还是比较强大的,不过确实比较大,而且我的项目要求可在运行时修改状态机的配置。

 

源码下载地址:

C++版本:qfFSM_for_cpp_v1.2.zip

Java版本:qfFSM_for_java_v1.2.zip

JavaScript版本:qfFSM_for_javascript_v1.2.zip

C#版本:qfFSM_for_csharp_v1.2.zip

Unity3D(C#)版本:qfFSM_for_unity3d_csharp_v1.2.zip

压缩包内含有一个简单的 StopWatch例程,UML状态图如下:

类库非常小,文件列表及说明如下:

qfState.h/.cpp:状态

qfStateMachine.h/.cpp:状态机,由状态、事件、转移规则组成,继承自qfState,可作为另一个状态机的子状态

qfEvent.h:事件,状态机的激励

PropertyBag.h:属性包,每个qfEvent都有一个属性包

qfFSM.h/.cpp:qfFsmLogic类,对qfStateMachine进行封装,提供一个大粒度状态机基类,状态机开始、停止、重置,状态机子状态管理。

================================

qfState状态有四个响应函数

entryAction:进入状态
doAction:执行本状态操作,目前的设计中,doAction会在entryAction执行后立即执行
exitAction:退出状态
onNotify:通知,如果本状态没有针对当前事件的转移规则,将会收到一个onNotify通知,完成一些特殊的事件处理需求

================================

qfStateMachine状态机内可以设置状态转移规则、绑定状态实现、处理外部事件

状态机内的转移规则配置由源状态名称、事件名称、目标状态名称组成,支持自动转移规则,可选择性的为一个状态绑定自定义的qfState对象实例,完成相应功能,运行时可随时修改这些绑定,切换另一个qfState实现,改变状态行为,当然转移规则也是可以运行时修改的。

状态机还支持设置环境变量,状态机嵌套时,父子状态机环境变量相互独立。

setTransfer(srcStateName, eventName, destStateName):设置转移规则

setAutoTransfer(srcStateName, destStateName):设置一条自动转移规则

setState(stateName, qfState*):绑定状态实现。

getRootENV():得到根状态机环境变量,多层状态机嵌套时很有用。

processAllEvent(qfEvent&):处理事件堆栈中的事件,阻塞方式,直到队列为空,将一个外部事件传入,状态机将查找转移规则,如果当前状态没有设置此事件转移,将会收到onNotify通知调用,此事件将冒泡给上层状态处理。

postEvent(qfEvent&):将事件放入事件堆栈。

processSingleEvent(qfEvent&):处理单个事件。

关于事件堆栈:postEvent()将事件压栈,processAllEvent()每次从栈顶取出事件,交由processSingleEvent()处理。

================================

qfEvent事件拥有事件名称、属性集合(由qfPropertyBag实现)

qfPropertyBag继承自std::map,用于存放<key, value>,可通过定义SUPPORT_BOOST_ANY_PROPERTY宏使用boost::any来作为value,否则使用void *作为value。

================================

qfFsmLogic是对状态机的封装,用于方便实现独立逻辑组件,提供start/stop/reset实现,qfState状态对象自动析构

setupStateMachine():一般只需要重写这个函数,完成环境变量配置、转移规则配置、状态对象绑定。

start():调用此函数后,状态机被初始化,可以执行processAllEvent()。

================================

发布历史:

2014年10月23日
————————
更新所有版本到v1.2;
允许bind一个qfFSMLogic示例给一个状态;
在qfStateMachine中增加reset()成员;
修复qfEvent中m_PropertyBag未实例化的bug;

2013年07月27日
————————
更新C#版本,含WinForm示例;
版本号定为v1.1;

2013年06月06日
————————
更新所有版本;
版本号定为v0.1;
状态机中增加事件堆栈,避免用递归来处理循环事件;

2013年05月19日
————————
发布qfFSM_for_unity3d_csharp版本;

2013年05月09日
————————
发布qfFSM_for_javascript版本;

2013年05月07日
————————
发布qfFSM_for_java版本;

2013年05月05日
————————
发布qfFSM_for_cpp版本;