一般的状态机实现如下,定义几个不同的状态,通过switch...case...语句实现不同状态的执行。
一般小型状态机使用上述方式实现,该方法的缺点,一是如果系统稍微复杂一些,将需要定义很多状态,同时增加case的数量。二是swich...case...将变得很复杂臃肿。
一个新的实现方法是使用函数本身作为执行的状态和保存当前的状态到函数指针。
使用函数名作为状态,这种方式的循环调用函数 state_machine_run(void * priv_data)将变得非常简练,而且能够保证每时每刻都有一个状态在执行。
以下是个随便写的简单的例子,实际比这个复杂些
#include <stdio.h> #include <stdlib.h> void state1(void *pre_data); void state2(void *pre_data); void state3(void *pre_data); void state4(void *pre_data); void (*state)(void *) = state1; void state1(void *pre_data) { printf("起床\r\n"); /*action1(); */ state = state2; } void state2(void *pre_data) { printf("吃早饭\r\n"); /*action2(); */ state = state3; } void state3(void *pre_data) { printf("上班 \r\n"); /*action3(); */ state = state4; /* if(A) state = state2; else state = state4; */ } void state4(void *pre_data) { printf("疯狂打码中...\r\n"); /*action4(); */ getchar(); exit(0); } void state_machine_run(void *pre_data) { while(1) { state(pre_data); } } int main() { void *p; state_machine_run(p); return 0; }