[C/C++]状态机设计

  • 定义消息队列,用来缓存来不及处理的消息;
  • 定义预处理,用来判断消息的有效性、是否需要缓存、延后处理等,预处理和状态机当前的状态无关;
  • 定义主处理,主处理应该是一个状态机栈,栈顶是当前的状态机上下文,其中存储当前状态机的状态等- 信息,根据消息ID,在当前状态机的对应状态处理表中,查找是否有消息ID对应的处理函数,如果有,则进入处理函数进行处理,如果没有,则消息将被丢弃(或者在预处理判断后进行缓存);
  • 定义后处理,当一层状态机退栈后,执行一次后处理,包括处理所有的缓存消息、内部消息(状态机可以自己给自己发内部消息,用来自己主动触发一些流程);
  • 所有处理的方式均为消息ID==》对应的处理函数,类似于查表的机制;
  • 单线程状态机不应该有计算密集型的任务,通常将计算密集型任务分发出去做异步计算处理;
  • 多层状态机:通常专门处理流程可以起2层甚至3层状态机,这样做的好处是分类更加明确,主要针对一些逻辑较为复杂的任务,例如建立连接,涉及到和远程的异步交互,可以专门起一个层二状态机,或者系统配置,可能涉及到和不同的模块交互,也可以专门起一个层二状态机。起层二状态机的方法是初始化一个新的状态机上下文对象,将其压栈即可。如果处理完毕,要退出层二装填机,则执行退栈即可;
  • 状态机之间的交互:通常一个模块一个状态机,模块之间采用统一的消息机制模拟交互,即SendMsg和RecvMsg。SendMsg本质上是将发送的消息给调度线程,调度线程将消息实体投递到对应pid的模块的消息队列中。RecvMsg是pop一次本模块的消息队列;
  • 线程分配:可以多个状态机共享一个线程,也可以每个状态机一个线程。如果多个状态机共享一个线程,需要确保每个状态机的每一个处理函数都是简单的,非计算密集型的,否则会影响到其他状态机的消息处理,导致消息队列爆满,无法再接收消息;
  • 消息队列实现:通常采用RingBuffer无锁队列;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include int main() { int state_key = 1; //钥匙状态 为1时钥匙区有钥匙,为时钥匙区 无钥匙 int state_hold = 0; // 钥匙持有状态 为1时持有钥匙,为时 未持有钥匙 int state_door = 0; //门状态 0:关闭 1:打开 int state_lock = 1; //上锁状态 1:上锁 0:解锁 int order; // 用于存放用户输入指令 printf("this is a game.\n"); printf ("if you want to OPEN THE DOOR ,input 1\n"); printf ("if you want to CLOSE THE DOOR ,input 2\n"); printf ("if you want to LOCK THE DOOR ,input 3\n"); printf ("if you want to UNLOCK THE DOOR,input 4\n"); // printf ("if you want to LOCK THE DOOR ,input 5\n"); printf("please input the order\n"); while(1) { scanf("%d",&order); // if(order!=(1||2||3||4)) // { // printf("worng input ,please input again.\n"); // continue; // } switch(order) { case 1 : if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_door=1; break; case 2: if(state_door==0) { printf("the door has been closed before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_door=0; break; case 3: if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_lock=1; break ; case 4: if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==0) { printf("the door has not been lock\n"); break; } state_lock=0; break ; } } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值