state Machine Demo

it2023-06-28  65

#include <stdlib.h> #include <stdio.h> #include <stdint.h> #include <glib.h> #include <unistd.h> using namespace std; typedef enum _EngineState { ENGINE_SERVER_STATE_NONE, ENGINE_SERVER_STATE_READY, ENGINE_SERVER_STATE_STARTING, ENGINE_SERVER_STATE_SENDING, ENGINE_SERVER_STATE_PROCESSING, ENGINE_SERVER_STATE_MAX }EngineState; typedef enum _eEngineMsg { ENGINE_MSG_NONE, ENGINE_MSG_START, ENGINE_MSG_REQUEST, ENGINE_MSG_STOP, ENGINE_MSG_MAX }eEngineMsg; typedef struct _EngineMsg { eEngineMsg MsgType; long param_1; long param_2; char* param_3; bool param_4; }EngineMsg; typedef struct _ServerTask { GThread *Thread; GAsyncQueue *Queue; gint running; }ServerTask; class CEngineServer { public: CEngineServer() { } virtual ~CEngineServer() { } void SetServerSRState(EngineState state) { m_EngineState = state; } EngineState GetServerSRState(void) { return m_EngineState; } static CEngineServer *GetInstance(void) { if(m_pInstance == NULL) { m_pInstance = new CEngineServer(); } return m_pInstance; } bool SetServerSRMsg(eEngineMsg MsgType, long MsgParam1 = 0, long MsgParam2 = 0, void* MsgParam3 = NULL, bool openFlag = true) { if(m_pServerTask == NULL) { printf("[ERROR] Task is not created yet..\n"); return false; } if(g_atomic_int_get(&m_pServerTask->running)) { EngineMsg* tmpMsg = (EngineMsg*)malloc(sizeof(EngineMsg)); if(tmpMsg == NULL) { printf("memory allocation fail"); return false; } tmpMsg->MsgType = ENGINE_MSG_NONE; tmpMsg->param_1 = 0; tmpMsg->param_2 = 0; tmpMsg->param_3 = NULL; tmpMsg->param_4 = true; tmpMsg->MsgType = MsgType; tmpMsg->param_1 = (long)MsgParam1; tmpMsg->param_2 = (long)MsgParam2; tmpMsg->param_3 = (char*)MsgParam3; tmpMsg->param_4 = openFlag; g_async_queue_push(m_pServerTask->Queue, (gpointer)tmpMsg); } else { printf("[ERROR] Task is not running ..\n"); return false; } printf("[Engine] success ..\n"); return true; } static gpointer t_ServerSRThread(gpointer data) { printf("t_ServerSRThread run !\n"); CEngineServer* pSvr = CEngineServer::GetInstance(); pSvr->SetServerSRState(ENGINE_SERVER_STATE_READY); EngineMsg loopMsg; while(g_atomic_int_get(&m_pServerTask->running)) { EngineMsg* msg = NULL; msg = (EngineMsg*) g_async_queue_try_pop (m_pServerTask->Queue); if(msg != NULL) { loopMsg.MsgType = msg->MsgType; loopMsg.param_1 = msg->param_1; loopMsg.param_2 = msg->param_2; loopMsg.param_3 = msg->param_3; loopMsg.param_4 = msg->param_4; } switch(pSvr->GetServerSRState()) { case ENGINE_SERVER_STATE_READY: { if(loopMsg.MsgType == ENGINE_MSG_START) { loopMsg.MsgType = ENGINE_MSG_NONE; pSvr->SetServerSRState(ENGINE_SERVER_STATE_STARTING); printf("[Engine] -READY- Start ..\n"); } break; } case ENGINE_SERVER_STATE_STARTING: { if(loopMsg.MsgType == ENGINE_MSG_REQUEST) { int nServerMode = (int)loopMsg.param_1; if(nServerMode == (0x01 | 0x02)) { pSvr->SetServerSRState(ENGINE_SERVER_STATE_SENDING); printf("[Engine] -STARTING- Open Success, -Sending-\n"); } } break; } case ENGINE_SERVER_STATE_SENDING: { if(loopMsg.MsgType == ENGINE_MSG_STOP) { loopMsg.MsgType = ENGINE_MSG_NONE; pSvr->SetServerSRState(ENGINE_SERVER_STATE_PROCESSING); printf("[Engine] -SENDING- Receive the Stop, Change Status to Processing ..\n"); } break; } case ENGINE_SERVER_STATE_PROCESSING: { bool bEngineStop = true; if(bEngineStop){ pSvr->SetServerSRState(ENGINE_SERVER_STATE_READY); printf("[Engine] -ENGINE_SERVER_STATE_READY..\n"); } if(loopMsg.MsgType == ENGINE_MSG_STOP) { pSvr->SetServerSRState(ENGINE_SERVER_STATE_READY); printf("[Engine] -PROCESSING- "); } break; } default: break; } } usleep(8000); } int CreateServerTask(void) { if(m_pServerTask == NULL) { m_pServerTask = g_new(ServerTask, 1); m_pServerTask->Queue = g_async_queue_new(); g_atomic_int_set (&m_pServerTask->running, 1); m_pServerTask->Thread = g_thread_new("t_ServerSR", t_ServerSRThread,NULL); return 0; } else { printf("[Error] Create Engine Server Task is exist .. "); return 0; } } private: EngineState m_EngineState; static ServerTask * m_pServerTask; static CEngineServer * m_pInstance; }; ServerTask *CEngineServer::m_pServerTask = NULL; CEngineServer* CEngineServer::m_pInstance = NULL; int main() { CEngineServer server; server.CreateServerTask(); GMainLoop *mainloop = g_main_loop_new(NULL, FALSE); sleep(3); server.SetServerSRMsg(ENGINE_MSG_START); sleep(3); int mode = 0x01 | 0x02; server.SetServerSRMsg(ENGINE_MSG_REQUEST, mode); sleep(3); server.SetServerSRMsg(ENGINE_MSG_STOP); g_main_loop_run(mainloop); return 0; }

 

最新回复(0)