一种有限状态机的控制方法及有限状态机与流程

文档序号:20439235发布日期:2020-04-17 22:17阅读:682来源:国知局
一种有限状态机的控制方法及有限状态机与流程

本发明涉及计算机应用技术领域,特别涉及一种有限状态机的控制方法及有限状态机。



背景技术:

有限状态机实现的功能很简单,即实现各个状态之间的相互转换。但实际应用的状态机可能需要更多的功能,比如状态切换时传递参数,父状态与子状态的包含关系等。

目前比较成熟的状态机是qt中实现的有限状态机算法,图1示出了一个典型的qt状态机流程,它可以通过信号驱动机制实现状态之间的切换,支持状态机开始、停止、暂停等功能,同时还支持父状态包含子状态、子状态之间切换、父状态之间切换等功能。图1中,s1状态是一个父状态,它包含3个子状态:s11,s12,s13,当触发button.clicked事件时,三个子状态可以互相切换,而当触发quitbutton.clicked事件时,不论状态机目前处于s1状态的何种状态,它可以立刻退出s1状态,进入final状态。

虽然qt状态机的功能强大,但该状态机的使用需要用qt编程,要包含qt的一些库,无法在纯净的c/c++代码中编程。而其他的状态机实现算法,例如《c专家编程》中实现的有限状态机或者其它公司代码中的状态机,例如ti官方代码中的任务状态机,实现的功能都比较简单,它们使用函数指针跳转表来实现各状态之间的切换。



技术实现要素:

本发明的目的在于克服现有技术存在的缺陷,提供了一种可以采用c++编码实现且包含多种功能的有限状态机。

为实现以上目的,本发明采用一种有限状态机的控制方法,包括:

根据状态机每个状态的名字和内存地址,创建状态机的每个状态,该状态包括两个父状态和一个final状态,每个父状态各包括三个子状态;

所述状态机当前的状态执行完毕后经postevent函数指定要跳转的下个状态,其中postevent函数的第一个参数为要跳转到的下个状态的名字、第二参数为要传递给下个状态的参数;

父状态或statemachine根据下个状态的名字从注册过的状态列表中查找到对应的内存地址,并执行该下个状态的接口函数;

子状态间跳转时,首先执行onentry函数,并在下个跳转的状态与当前状态相同时,则执行handletimeout函数;以及在下个跳转的状态与当前状态不同时,则执行当前状态的onexit函数再执行onentry函数。

进一步地,所述根据状态机每个状态的名字和内存地址,创建状态机的每个状态,包括:

创建状态机的两个父状态和一个final状态,final状态继承自state类;

创建两个父状态各自的三个子状态,每个子状态继承自state类;

将每个父状态各自下的三个子状态添加到对应的父状态中并设置初始执行状态;

将两个父状态和final状态添加到statemachine中,并设置statemachine的初始执行状态;

所述父状态向所述statemachine注册,并发送其名字和内存地址;

所述子状态向父状态注册,并发送其名字和内存地址。

进一步地,所述状态机启动时,先进入到一个父状态,并根据相应的切换信号,切换到另一个父状态;

当所述状态机接收到stopmachine信号时,状态机由当前状态切换至final状态。

另一方面,采用一种有限状态机,采用如上所述的有限状态机的控制方法。

与现有技术相比,本发明存在以下技术效果:本发明中的状态机可采用纯c++编码,可以嵌入到各种平台使用,该状态机还可提供多种功能,包括子状态切换、父状态切换、子状态循环和状态间传递参数等。

附图说明

下面结合附图,对本发明的具体实施方式进行详细描述:

图1是qt状态机流程图;

图2是一种有限状态机的控制方法的流程示意图;

图3是本发明状态机的流程图;

图4是本发明状态机的核心算法示意图。

具体实施方式

为了更进一步说明本发明的特征,请参阅以下有关本发明的详细说明与附图。所附图仅供参考与说明之用,并非用来对本发明的保护范围加以限制。

如图2所示,本实施例公开了一种有限状态机的控制方法,包括如下步骤s1至s4:

s1、根据状态机每个状态的名字和内存地址,创建状态机的每个状态,该状态包括两个父状态和一个final状态,每个父状态各包括三个子状态;

s2、所述状态机当前的状态执行完毕后经postevent函数指定要跳转的下个状态,其中postevent函数的第一个参数为要跳转到的下个状态的名字、第二参数为要传递给下个状态的参数;

s3、父状态或statemachine根据下个状态的名字从注册过的状态列表中查找到对应的内存地址,并执行该下个状态的接口函数;

s4、子状态间跳转时,首先执行onentry函数,并在下个跳转的状态与当前状态相同时,则执行handletimeout函数;以及在下个跳转的状态与当前状态不同时,则执行当前状态的onexit函数再执行onentry函数。

需要说明的是,本状态机采用简单的语言提供了丰富的状态机功能,使用简单,可移植性强,可以有效的简化代码逻辑,更加合理的组织程序结构,可维护性强。

进一步地,上述步骤s1:根据状态机每个状态的名字和内存地址,创建状态机的每个状态,具体包括如下细分步骤:

创建状态机的两个父状态和一个final状态,final状态继承自state类;

创建两个父状态各自的三个子状态,每个子状态继承自state类;

将每个父状态各自下的三个子状态添加到对应的父状态中并设置初始执行状态;

将两个父状态和final状态添加到statemachine中,并设置statemachine的初始执行状态;

所述父状态向所述statemachine注册,并发送其名字和内存地址;

所述子状态向父状态注册,并发送其名字和内存地址。

以下列举该状态机的具体用法:

该用法在threadmachine.cpp文件中,代码如下:

首先创建2个父状态和一个final状态,final状态继承自state类

state*pworkstate=newstate(pstatemachine);

state*pchargestate=newstate(pstatemachine);

statefinal*pstatefinal=newstatefinal(pstatemachine);

然后创建pworkstate状态的三个子状态,每个状态都继承自state类

stategetjob*pstategetjob=newstategetjob(pworkstate);

stategotopoint*pstategotopoint=newstategotopoint(pworkstate);

statefinish*pstatefinish=newstatefinish(pworkstate);

再创建pchargestate状态的三个子状态,每个状态都继承自state类

statebegincharge*pstatebegincharge=newstatebegincharge(pchargestate);

stateopendoor*pstateopendoor=newstateopendoor(pchargestate);

stateclosedoor*pclosedoor=newstateclosedoor(pchargestate);

将pworkstate状态的三个子状态添加到pworkstate父状态中并设置初始执行状态

pworkstate->addstate("getjob",pstategetjob);

pworkstate->addstate("gotopoint",pstategotopoint);

pworkstate->addstate("finished",pstatefinish);

pworkstate->setinitstate(pstategetjob);

将pchargestate状态的三个子状态添加到pworkstate父状态中并设置初始执行状态

pchargestate->addstate("begincharge",pstatebegincharge);

pchargestate->addstate("opendoor",pstateopendoor);

pchargestate->addstate("closedoor",pclosedoor);

pchargestate->setinitstate(pstatebegincharge);

将两个父状态以及final状态添加到pstatemachine中

pstatemachine->addstate("workstate",pworkstate);

pstatemachine->addstate("chargestate",pchargestate);

pstatemachine->addfinalstate(pstatefinal);

设置pstatemachine的初始执行状态

pstatemachine->setinitstate(pworkstate);

启动状态机

pstatemachine->start();

特别地,状态机启动后,首先执行pworkstate中的pstategetjob状态,当该状态执行结束后,继续执行pworkstate状态中的其它状态,当pstatemachine收到父状态切换信号后,状态机从pworkstate状态中退出,然后执行pchargestate的pstatebegincharge状态,当状态机收到停止信号后,执行pstatefinal状态的接口函数。

需要说明的是,如图4所示,state.cpp和statemachine.cpp,state.cpp是该状态机的基类,实现了状态机每个状态的方法,statemachine.cpp继承自state类,负责状态机的启停,以及管理父状态之间的切换工作,子状态之间的切换工作由父状态完成。每个状态都有自己的名字,在创建父状态时,父状态要向statemachine注册,提供自己的名字和内存地址,子状态创建后要向父状态注册,提供自己的名字和内存地址。当一个状态执行完毕跳转到下一个状态时,通过postevent函数指定要执行的下个状态,postevent函数的第一个参数是要跳转到的下个状态的名字,第二个参数是要传递给下个状态的参数,可以为空,父状态或statemachine根据下个状态的名字从注册过的状态列表中找到它的内存地址,然后执行该状态的接口函数。

每个子状态都有3个执行函数,分别是onentry,handletimeout,onexit函数,当首次进入该状态时,会执行onentry函数,执行一些初始化工作,当下个跳转的状态跟当前状态相同时,则执行handletimeout函数,当下个跳转的状态跟当前状态不同时,则先执行当前状态的onexit函数,执行一些清理工作,然后再执行下个状态的onentry函数。

进一步地,本实施例中的状态机采用纯c++编码,可以嵌入到各种平台中使用。该状态机提供了多种功能,包括子状态切换,父状态切换,子状态循环,状态间传递参数等,如图3所示:状态机启动之前,要先初始化一下它的父状态,以确定当状态机进入到dojob状态或gotocharge状态时,该先执行哪个子状态;并初始化一下整个状态机的初始态,以确定状态机启动时要进入哪个父状态。上图3中的状态机启动时会先进入dojob状态,当状态机收到switchtogotocharge信号时,会切换到gotocharge状态,当状态机收到stopmachine信号时,不论状态机处在哪种状态,都会切换到finale状态。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1