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


#ifndef __WSPQUEUE_H_ 
#define __WSPQUEUE_H_ 
#include  
 
#include "spBaseLock.h" 
/* 
队列管理:v 0.1 
分为两部分:1 排队队列,用于所有等待资源的申请者 
            2 使用者队列,已经被批准的申请者队列 
 
*/ 
namespace spBase 
{//定义名字空间 
 
//成功 
#define QA_SUCCESS		0 
//超时退出 
#define QA_TIMEOUT		1 
//队列满,不接受新的申请 
#define QA_FULL			2 
//对象已经被关闭 
#define QA_CLOSED		3 
//释放失败 
#define QA_RELEASE		4 
//票据不合法 
#define QA_TICKET_ERROR	10 
//使用者记数器错误 
#define QA_COUNTER1		20 
//队列计数器错误 
#define QA_COUNTER2		21 
//未知错误 
#define QA_ERROR		99 
 
class CQueueAdmin 
{ 
public: 
	//CQueueAdmin(LPCSTR pszQueueName); 
	//iMaxConsumer : 定义可以同时申请到资源的申请者数量 
	//iQueueLength : 定义可以在等待队列中进行等待的申请者数量 
	//iDefaultTimeOut : 默认的超时时间,以毫秒为单位 
	CQueueAdmin(LPCSTR pszQueueName,int iMaxConsumer,int iQueueLength,int iDefaultTimeOut=1000); 
	~CQueueAdmin(); 
public: 
	//进入队列并等待, 
	//int* piTicket,用于得到本次申请的顺序号,无论是否申请成功,这个变量中将会返回本次申请顺序号 
	//pszName : 申请者名称 
	//iTimeOut : 超时时长,如果为 -1 表示使用默认值 
	//返回QA_SUCCESS表示成功,否则返回失败原因 
	int EnterQueue(int* piTicket,LPCSTR pszName="undefined",int iTimeOut=-1); 
	//已经申请到资源的申请者在使用完资源后,从队列中退出 
	//通过iTicket来检查是否该申请者的合法性 
	int QuitQueue(int iTicket,LPCSTR pszName="undefined"); 
 
	//得到队列中等待的申请者的数量 
	int GetQueueCounter(void); 
	//得到当前正在使用资源的申请者数量 
	int GetConsumerCounter(void); 
 
	//得到各种属性值 
	int GetTimeOut(void){return m_iDefaultTimeOut;}; 
	int GetMaxConsumer(void){return m_iMaxConsumer;}; 
	int GetQueueLength(void){return m_iQueueLength;}; 
	LPCSTR GetQueueName(void){return m_szQueueName;}; 
protected: 
	//创建对象 
	BOOL CreateObject(void); 
	//删除对象 
	BOOL DeleteObject(void); 
 
protected://内部变量 
	HANDLE m_hSem;//用于排队的核心变量 
	int m_iConsumerCounter;//当前已经被批准的申请者数量 
	int m_iQueueCounter;//当前正在排队的申请者数量 
	int m_iDefaultTimeOut,m_iMaxConsumer,m_iQueueLength; //默认的超时时间,最大的使用者数,最大的等待者数 
	CString m_szQueueName;//队列名称 
 
	//保存有效票据 
	CMap m_mapTickets; 
	CRWAccessLock *m_plockConsumer,*m_plockQueue; 
	CSequenceGenerator *m_pseqTicket; 
}; 
 
}//end namespace 
#endif