基于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来说相对易读,但是状态一旦达到十几二十个,切换状态也频繁的时候,这两种方法都不太适用。但是对于小状态判断以及切换,上述方法足矣。