简单状态机实现
来源:互联网 发布:淘宝仓库招聘 编辑:程序博客网 时间:2024/06/11 01:43
代码如下,是ansi c编写的demo。
这个简单的状态机使用c语言函数指针实现,可以支持状态转换、状态超时。
这个简单的状态机使用c语言函数指针实现,可以支持状态转换、状态超时。
#include <time.h>
#include <stdio.h>
void delay_ms(int ms)
{
//系统延时函数
}
unsigned int systemMs(void)
{
clock_t c = clock()+100;
return c;
}
/************ 状态机 BEGIN *****************/
typedef void (*state_func_t)(void);
static unsigned int g_state_timeout_milliseconds=0;
static state_func_t g_state_func = NULL;
void main_setNextState(state_func_t func)
{
/*
* g_state_timeout_milliseconds
* 可以用于判断是否进入一个新状态;
* 还可以用于判断进入某个状态多长时间了。
*/
g_state_timeout_milliseconds = 0;
g_state_func = func;
}
state_func_t main_getNextState(void)
{
return g_state_func;
}
/************ 状态机 END *****************/
/************ 状态函数 BEGIN *************/
void main_state1(void);
void main_state2(void);
void main_state1(void)
{
if(0 == g_state_timeout_milliseconds) {
g_state_timeout_milliseconds = systemMs();
printf("enter state1\n");
}
if(systemMs() - g_state_timeout_milliseconds > 5*1000) {
printf("exit state1\n");
main_setNextState(main_state2);
return;
}
/*
* TODO 这里实现业务逻辑
* 比如到达某种条件,进入其他状态
* 比如收到某条消息,进入其他状态
*/
}
void main_state2(void)
{
if(0 == g_state_timeout_milliseconds) {
g_state_timeout_milliseconds = systemMs();
printf("enter state2\n");
}
if(systemMs() - g_state_timeout_milliseconds > 2*1000) {
printf("exit state2\n");
main_setNextState(main_state1);
return;
}
/*
* TODO 这里实现业务逻辑
* 比如到达某种条件,进入其他状态
* 比如收到某条消息,进入其他状态
*/
}
/************ 状态函数 END *************/
int main(int argc, char *argv[])
{
printf("Hello, state machine!\n");
/*
* 设置初始状态
*/
main_setNextState(main_state1);
/*
* 状态驱动
* 每一个状态,处理完自己的事情后,负责指定下一个状态(使用main_setNextState函数)
*/
while(1) {
(*main_getNextState())();
delay_ms(1);
}
return 0;
}
0 0
- AC状态机简单实现
- 简单的状态机实现
- 简单状态机实现
- 读书笔记: 状态机的简单实现
- [Android] 简单的状态机实现
- 使用状态机实现简单的AI
- JAVA enum实现简单状态机功能
- JAVA enum实现简单状态机功能
- 一个简单C++语言状态机实现
- 状态机实现
- 一个简单的游戏引擎核心状态机的C++实现
- 简单状态机BitFSM
- pyqt 状态机简单例子
- 状态机(二):Verilog状态机实现
- LUA实现状态机
- qt状态机的实现
- 标准状态机的实现
- 状态机的实现
- Android 与Springmvc之间交互若干问题(消息,文件,自定义dialog...)
- memset(string) 是错误
- 在windows 2003 中,启动SQL Server 2000 提示“没有找到MSVCR71.dll因此这个应用程序未能启动”
- iOS 的 APP 如何适应 iPhone 5s/6/6Plus 三种屏幕的尺寸?
- 用LaTeX的pstricks绘图宏包制作一幅图片
- 简单状态机实现
- 自学 iOS 开发的一些经验
- 新手入门陌生的布尔数据
- JQuery 遍历
- Application
- word文档生成CHM格式
- js json操作
- iOS: 在代码中使用Autolayout (1) – 按比例缩放和优先级
- Android各种机型,各种系统版本,如何获取外置SDCard路径