使用while(1)循环作为C中的临时状态机?

时间:2016-02-18 05:29:01

标签: c while-loop state-machine

所以我看到很多关于在C中实现状态机的建议涉及状态结构等,但我想知道为什么我们不能只使用while(1)来处理非常简单的状态机。例如,

 int currentstate = state1;

 void state1function(){
    dosomething();
    if(user chooses to go to state 2){
       currentstate = state2;
    }
 }

 int main{
    while(1){
       if(currentstate == state1){
          state1function();
       }
       else if (currenstate == state2){
          state2function();
 }

基本上跟踪全局变量中的状态,并在while循环中根据状态调用函数。这对我来说似乎很简单,我不明白为什么它不会起作用。

任何人都可以告诉我为什么这样的东西不起作用/不会被推荐?

由于

4 个答案:

答案 0 :(得分:3)

迟早,使用这种方法,你会发现拥有:

会很方便
  • 显式转换表。
  • OnEntry(), OnExit(), Do(), OnEvent()为每个州提供服务。
  • 对转换执行的操作。
  • 警卫。 (触发过渡的明确条件)
  • 嵌套状态机。
  • 并发状态机。含义:多个FSM彼此相邻运行。
  • 通信并发的嵌套状态机。

在这个复杂阶梯的某个地方,你很可能放弃蛮力风格,你开始时,这可能看起来像你在问题中给出的代码。

while(1)构造与状态机完全无关。只要单个执行线程(main()或OS线程)长时间运行,就会使用它,因为它们通常位于嵌入式系统或服务器应用程序上。如果申请是以状态机的形式或其他形式编写的,那么这并不重要。

答案 1 :(得分:2)

根据您尝试解决的问题,全局或静态是一种简单的解决方案。当您需要一次管理多个状态机时,和/或当您需要从多个线程或进程更改状态时,使用结构派上用场。

答案 2 :(得分:1)

没有等待的while循环将占用大量CPU。我认为使用互斥锁或seamphores的事件机制将非常有用。

答案 3 :(得分:0)

C不是异步的(默认情况下)。无限循环只会导致程序“冻结”,直到结果完成。