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