小小状态机

基于QT状态机的实现

因为设计到的状态并不是很多,所以使用swit/case语句实现简易的状态机


一、状态机是什么?

有限状态机就是在有限个状态中进行不同状态切换的数学模型,在很多企业中都会用到,一个健壮的状态机能处理各种预想不到的情况。

二、状态机的实现

1.定义好状态以及状各个态执行的事件

代码如下(示例):

//BT.h
/*BT STATE*/
typedef enum
{
    BT_RESET=0,
    BT_SEARCH,
    BT_BTCONN,
    BT_RecvdataParse,
    BT_DISCONN,
    BT_EXIT
}BT_STATE;

/*BT EVENT*/
 static void BT_EVENT_Reset();
 static void BT_EVENT_Search();
 static void BT_EVENT_ConnectMac();
 static void BT_EVENT_DisConnect();
 static void BT_EVENT_RecvdataParse();
 static void BT_EVENT_EXIT();

static quint8 running_state;

2.初始化

因为需要自动执行程序,所以用到定时器来判断当前状态
代码如下(示例):

//BT.cpp
Qtimer BT_state_Timer = new QTimer(this);
BT_state_timer->stop();
//超时触发槽函数
connect(BT_state_timer,SIGNAL(timeout()),this,SLOT(handle_BTstep_timeout()));

3.实现

//BT.cpp
//点击start按钮就开始计时
...
BT_state_timer->start(500);//500mss
...


void handle_BTState_timeout()
{
	switch(running_state)
	{
		case BT_RESET:
		{
			BT_EVENT_Reset();
			break;
		}
		case BT_SEARCH:
		{
			BT_EVENT_Search();
			break;
		}
		case ...:
			do sometings...
			break;
	}
	
}

就这样每过500ms判断当前状态并执行对应函数,当然也在必要时候停止重新开启时钟,比如在这个Search状态里,搜索不到蓝牙,那停止时钟,start(1500),然后再进行下一步操作。


总结

这个状态机适用于事件比较少的情况下,当然也可以用if/else语句,但是代码太多余简单,显得很不专业哈。
用了switc/case语句相对于if/else来说相对易读,但是状态一旦达到十几二十个,切换状态也频繁的时候,这两种方法都不太适用。但是对于小状态判断以及切换,上述方法足矣。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值