我正在做一个状态机,它应该在进入新状态时评估一些条件,并且根据这些条件,应该触发适当的新事件。我的第一个想法是从onEntry
函数发送事件但是我有间接递归,据我所知(可能我错了),有点危险(因为堆栈溢出错误的可能性)。
以下是示例代码(注意,它只是状态机模式的示例我需要使用):
state_machine.h
typedef enum State
{
STATE_A,
STATE_B,
STATE_C
} State;
typedef enum Event
{
EVENT_A,
EVENT_B,
EVENT_C,
EVENT_D,
EVENT_E,
EVENT_F
} Event;
void handleEvent(Event event);
state_machine.c
#include "state_machine.h"
static void switchState(State newState, Event event);
static void onExit(Event event);
static void onEntry();
static State currentState = STATE_A;
void handleEvent(Event event)
{
switch (currentState)
{
case STATE_A:
switchState(STATE_B, event);
break;
case STATE_B:
switchState(STATE_C, event);
break;
case STATE_C:
switchState(STATE_A, event);
break;
default:
break;
}
}
void switchState(State newState, Event event)
{
onExit(event);
currentState = newState;
onEntry();
}
void onExit(Event event)
{
// ...
}
void onEntry()
{
switch (currentState)
{
case STATE_A:
if (condition)
{
handleEvent(EVENT_C);
}
else
{
handleEvent(EVENT_D);
}
break;
case STATE_B:
// ...
break;
case STATE_C:
// ...
break;
default:
break;
}
}
我对这个问题的第二个解决方案是拥有nextState
变量,该变量将在onEntry
函数中设置(而不是handleEvent
调用)。然后在handleEvent
函数的顶部,我会像这样:
if (nextEvent != EVENT_NULL)
{
event = nextEvent;
nextEvent = EVENT_NULL;
}
现在,我的问题是:在这种情况下,什么是更好的方法和/或通常做什么?
提前致谢