⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rpgcmdprocess.h

📁 五行MMORPG引擎系统V1.0
💻 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 + -