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