📄 rpgcmdprocess.h
字号:
//RPGCmdProcess.h
/*/////////////////////////////////////////////////////////////////
李亦
liease@163.com 4040719
2006-7-20
/*/////////////////////////////////////////////////////////////////
#ifndef _RPGCMDPROCESS_H_
#define _RPGCMDPROCESS_H_
#ifndef _RPG__RPGCOMMANDDEFINE_H_
#include "RPGCommandDefine.h"
#endif
#ifndef _TCYCLEQUEUE_H_
#include "rpg/core/tCycleQueue.h"
#endif
#ifndef _DATACHUNKER_H_
#include "core/dataChunker.h"
#endif
#ifndef _PLATFORMMUTEX_H_
#include "platform/platformMutex.h"
#endif
#ifndef _PLATFORMTHREAD_H_
#include "platform/platformThread.h"
#endif
namespace RPG
{
#define RPGCMD_USE_THREAD
//#ifdef RPGCMD_USE_THREAD
// #define CMDPRO_WAIT true
//#else
#define CMDPRO_WAIT false
//#endif
/////////////////////////////////////////////////////////////////
/// RPG游戏指令管理
class RPGCmdProcess
#ifdef RPGCMD_USE_THREAD
: public Thread
#endif
{
GCMDTASK* m_pCmdParam;
static FreeListChunker<GCMDTASK> ms_ParamPool;
static MutexInstance ms_mutexParamPool;
enum RPGCommandConstants
{
QUEUE_SIZE = 64,
QUEUE_GROW = 64
};
protected:
MutexInstance m_mutexInst;
CycleQueue<GCMDTASK> m_taskQueue;
Vector<GCMDTASK*> m_sendingQueue;
CycleQueue<GCMDTASK> m_resultQueue;
U32 m_dwRunDelay; //循环的延迟
U32 m_dwExpireTime; //超时时间
U32 m_dwTryTimes; //重试次数
BOOL m_bRunning;
U32 m_dwTaskIdle;
BOOL m_bProcessResult;
//BOOL m_bSendingIdle;
//BOOL m_bResultIdle;
enum TaskIdleStates
{
TIS_NONE = 0,
TIS_TASK = 1,
TIS_SENDING = 2,
TIS_RESULT = 4,
TIS_WORKING = TIS_TASK | TIS_SENDING | TIS_RESULT
};
enum TaskStates
{
TS_OK,
TS_FAILED,
TS_RESULTFAILED,
TS_RESULTOK,
TS_EXPIRED
};
enum TaskOperatings
{
TO_FAILED=-1,
TO_OK,
TO_GHOST,
TO_MOVE
};
//U32 m_dwTimer;
//CSTR m_pClassName;
private:
void SetIdleState(U32 dwState,BOOL bSet=TRUE) {if(bSet) m_dwTaskIdle |= dwState; else m_dwTaskIdle &= ~dwState;}
void SetWorkingIdleState() {m_dwTaskIdle = TIS_WORKING;}
BOOL NeedIdle() {return m_dwTaskIdle == TIS_NONE;}
public:
//构造/析构函数
RPGCmdProcess();
~RPGCmdProcess();
protected:
//void SendingTask(GCMDTASK* pTask);
//从TaskQueue中获取指令任务,我们需要重写OnSendingTask,决定任务是否
//能派发出去,返回TRUE,将把任务暂存到sending队列,等待响应或超时
virtual S32 OnSendingTask(GCMDTASK* pTask)=0;
virtual void OnTaskFinished(GCMDTASK* pTask,TaskStates state){}
virtual S32 OnRespondeTask(GCMDTASK* pTask)=0;
static GCMDTASK* AllocCmdTask();
static void FreeCmdTask(GCMDTASK* pTask);
BOOL CheckSendingTask(GCMDTASK* pTask);
BOOL CheckSendingTask(U32 dwCmd,U32 dwParam1=0,U32 dwParam2=0);
void RemoveSendingTask(GCMDTASK* pTask);
public:
//#ifdef RPGCMD_USE_THREAD
virtual void run(S32 arg = 0);
//#else
// virtual void Process();
//#endif
inline void Process() {run();}
inline void StopProcess() {m_bRunning = FALSE;}
virtual void OnStopProcess(){}
public:
//static void Initialize(CSTR pObjName);
//static void Destroy();
//static void Process();
virtual BOOL CheckCmd(U32 dwCmd){return TRUE;}
BOOL AddTask(U32 dwCmd,U32 dwParam1=0,U32 dwParam2=0);
BOOL AddTask(GCMDTASK* pTask);
BOOL GhostTask(GCMDTASK* pTask);
BOOL ResultTask(GCMDTASK* pTask);
BOOL ResultTask(U32 dwCmd,U32 dwParam1=0,U32 dwParam2=0);
GCMDTASK* BeginTask(U32 dwCmd);
BOOL EndTask();
public:
//DECLARE_CONOBJECT(RPGCmdProcess);
};//class RPGCmdProcess
///////////////////////////////////////////////////////
inline GCMDTASK* RPGCmdProcess::AllocCmdTask()
{
ms_mutexParamPool.lock(true);
GCMDTASK* pTask = ms_ParamPool.alloc();
pTask->dwExpire = 0;
pTask->dwTrys = 0;
pTask->dwSequence = 0;
ms_mutexParamPool.unlock();
return pTask;
}
inline void RPGCmdProcess::FreeCmdTask(GCMDTASK* pTask)
{
ms_mutexParamPool.lock(true);
ms_ParamPool.free(pTask);
ms_mutexParamPool.unlock();
}
};//namespace RPG
#endif //_RPGCMDPROCESS_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -