www.pudn.com > 2003090514065121890.zip > spServer.h


#ifndef __SP_SERVER_THREAD_H_ 
#define __SP_SERVER_THREAD_H_ 
#include "spBaseLock.h" 
 
/* 
#if defined(_DEBUG) 
	#pragma comment(lib, "spServer_D.lib") 
#else 
	#pragma comment(lib, "spServer.lib") 
#endif 
*/ 
 
namespace spBase 
{ 
/* 
下面的类为与服务器线程控制有关的类 
*/ 
//定义显示类 
class COutputDisplay 
{ 
public: 
	COutputDisplay(){}; 
	~COutputDisplay(){}; 
	enum ErrorLevel  
	{//定义显示时的消息类型 
		Message,//普通信息 
		Success, //执行成功 
		GeneralWarn, 
		FatalWarn, 
		GeneralError, 
		FatalError, 
	}; 
public: 
	//输出 
	virtual BOOL PutLine(ErrorLevel eLevel,LPCSTR pszOutput){return FALSE;}; 
	//得到错误类型的描述 
	//pszOut用于输出描速内容,字符串长度必须大于20 
	static void GetErrorLevelString(ErrorLevel eLevel,char* pszOut) 
	{ 
		ASSERT(eLevel<=FatalError); 
		static char szDesc[6][12]={"信息","执行成功","普通警告","严重警告","普通错误","严重错误"}; 
		strcpy(pszOut,szDesc[(int)eLevel]); 
	}; 
}; 
//彩色文本输出类 
//该类的对象在系统中只能有一个实例,对象是线程安全的 
class CClrOutputDisplay : public COutputDisplay 
{ 
public: 
	CClrOutputDisplay(); 
	~CClrOutputDisplay(); 
public: 
	//输出 
	virtual BOOL PutLine(ErrorLevel eLevel,LPCSTR pszOutput); 
public: 
	WORD m_wTextAttr[6];//保存颜色SetConsoleTextAttribute,用户可以自行修改,分别对应ErrorLevel中的定义 
protected: 
	HANDLE m_hOutput; 
}; 
 
//文件输出类 
//该类的对象在系统中只能有一个实例,对象是线程安全的 
class CFileOutputDisplay : public COutputDisplay 
{ 
public: 
	CFileOutputDisplay(LPCSTR pszServerName,LPCSTR pszFileName); 
	~CFileOutputDisplay(); 
public: 
	//输出 
	virtual BOOL PutLine(ErrorLevel eLevel,LPCSTR pszOutput); 
protected: 
	CString m_szFileName;//输出文件名 
	CSingleAccessLock m_lockFile; 
}; 
 
//定义服务器状态类 
class CServerStatus 
{ 
public: 
	//在创建服务器时需要指定服务器名称 
	CServerStatus(LPCSTR pszServerName); 
	~CServerStatus(); 
public://定义对子线程数量的控制 
	int IncreaseChildThread(void); 
	int DecreaseChildThread(void); 
	int GetChildThreadNumber(void); 
public://父线程控制 
	enum ParentThreadStatus 
	{//定义线程的运行状态 
		NotRun, 
		Running, 
		Pause, 
		Ask2Quit, 
	}; 
	//父线程未运行时返回FALSE 
	BOOL SetResume(void); 
	//父线程未运行时返回FALSE 
	BOOL SetPause(void); 
	//父线程未运行时返回FALSE 
	BOOL SetAsk2Quit(void); 
	//设置当前状态为停止 
	BOOL SetNotRun(void); 
	//设置当前状态为运行 
	BOOL SetRunning(void); 
	//返回父线程状态 
	ParentThreadStatus GetParentThreadStatus(void); 
	//得到父线程状态描述, 
	//pszOut用于输出描速内容,字符串长度必须大于20 
	static void GetParentThreadStatusString(ParentThreadStatus eStatus,char* pszOut) 
	{ 
		ASSERT(eStatus<=Ask2Quit); 
		static char szDesc[4][12]={"未运行","运行中","暂停","退出过程中"}; 
		strcpy(pszOut,szDesc[(int)eStatus]); 
	}; 
protected: 
	int m_iChildThreadNumber;//当前子线程数量 
	CRWAccessLock *m_plockChildThreadNumber;//访问控制 
 
	ParentThreadStatus m_eParentThreadStatus;//当前父线程状态 
	CRWAccessLock *m_plockParentThreadStatus;//访问控制 
}; 
 
//定义全局数据保存类 
//该类必须重载 
class CGlobalDataStorage 
{ 
public: 
	CGlobalDataStorage(LPCSTR pszServerName,COutputDisplay *pDisplay):m_statusServer(pszServerName) 
	{ 
		m_pDisplay = pDisplay; 
		m_szServerName = pszServerName; 
	} 
	~CGlobalDataStorage(){}; 
public: 
	//得到保存服务器状态的对象指针 
	CServerStatus* GetServerStatus(void){return &m_statusServer;}; 
	//得到显示类指针 
	COutputDisplay* GetDisplay(void){return m_pDisplay;}; 
	//得到服务器名称 
	LPCSTR GetServerName(void){return (LPCSTR)m_szServerName;}; 
protected: 
	CServerStatus m_statusServer; 
	COutputDisplay *m_pDisplay; 
	CString m_szServerName; 
}; 
 
//下面的类为线程控制类的基类 
class CBaseThread 
{ 
public: 
	CBaseThread(); 
	~CBaseThread(); 
public://线程控制成员函数 
	//创建新线程, 
	//fRunNow = TRUE 线程创建后立即运行 
	//fRunNow = FALSE 线程创建后不立即运行,如果要使新创建的线程运行必须调用 ResumeThread 
	BOOL CreateNewThread(BOOL fRunNow=TRUE); 
	//用于线程处理的静态成员函数 
	void ResumeThread(void); 
	//暂停运行线程 
	void SuspendThread(void); 
	//设置线程优先权 
	//可用值:THREAD_PRIORITY_NORMAL THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_HIGHEST 
	void SetThreadPriority(int iPriority=THREAD_PRIORITY_NORMAL); 
public://处理功能成员函数 
	static DWORD MainThread(LPVOID pData) 
	{ 
		return ((CBaseThread*)pData)->MainThread2(pData); 
	} 
	//通过虚拟函数来实现子类的处理过程的重载 
	virtual DWORD MainThread2(LPVOID pData)=0; 
	//重新运行线程 
private: 
	HANDLE m_hThread;//线程句柄 
}; 
 
class CParentThread : public CBaseThread 
{ 
public: 
	CParentThread(){}; 
	~CParentThread(){}; 
public: 
	virtual DWORD MainThread2(LPVOID pData)=0; 
}; 
 
class CChildThread : public CBaseThread 
{ 
public: 
	CChildThread(){}; 
	~CChildThread(){}; 
public: 
	virtual DWORD MainThread2(LPVOID pData)=0; 
}; 
 
}// end namespace 
 
#endif