www.pudn.com > AtModem.rar > YsQueue.h
// Queue.h: interface for the CQueue class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_QUEUE_H__ECADBF81_B282_11D5_971D_0050BADA81C3__INCLUDED_) #define AFX_QUEUE_H__ECADBF81_B282_11D5_971D_0050BADA81C3__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 /**************************************************************** 名称: 模板线程同步队列类 作者: 广州暨南大学97计算机 姚舜 EMAIL: ycatx@ycatx.net 创建时间: 2003.5.16 最近修改时间: 2003.5.16 功能: 循环队列操作,支持超时功能 使用: 先Init(nSize),然后才可以进行Put(),Get()操作,循环队列操作的封装 说明: 支持多线程 等级: ☆ ****************************************************************/ templateclass CYsQueue { public: UINT GetLastError() { return m_uLastError; } int m_nSize;//队列长度 int GetCount()//取得当前队列的总数 { m_uLastError=0; return m_iCount; } CYsQueue(UINT uSize) { m_iCount=0; m_pQueue=NULL; m_nRear=m_nFront=0; m_handle[0]=NULL; m_handle[1]=NULL; m_nSize=0; m_uLastError=0; Init(uSize); } virtual ~CYsQueue() { if(m_handle[0]) CloseHandle(m_handle[0]); if(m_handle[1]) CloseHandle(m_handle[1]); delete m_pQueue; } BOOL Clear()//清除列队 { m_uLastError=0; //非暴力手法 //等待互斥对象 DWORD dw=WaitForSingleObject(m_handle[0],INFINITE); if(dw!=WAIT_OBJECT_0) { TRACE("Clear Function 出现不应该出现的错误%d\n", GetLastError()); m_uLastError=1; return FALSE; } TRACE("clear queue\n"); CloseHandle(m_handle[1]);//关掉信标 m_handle[1]=CreateSemaphore(NULL,0,m_nSize,NULL);//创建信标 if(!m_handle[1]) { TRACE("初始化信标失败!\n"); m_uLastError=9; return FALSE; } m_nRear=m_nFront=0; ReleaseMutex(m_handle[0]); return TRUE; } BOOL Put(ElementT* pElement,int iCount=1)//插入队列 { m_uLastError=0; ASSERT(m_nSize); //等待互斥对象 DWORD dw=WaitForSingleObject(m_handle[0],INFINITE); //超时,或出错//应该不会出现这种情况 if(dw==WAIT_FAILED) { m_uLastError=6; TRACE("put function 出现不应该出现的错误:%d\n", GetLastError()); } if(dw!=WAIT_OBJECT_0) { m_uLastError=1; TRACE("put function 出现不应该出现的错误:%d\n", GetLastError()); return FALSE; } BOOL fOk; for(int i=0;i Get wait time out\n"); ReleaseMutex(m_handle[0]); return FALSE; default: TRACE("get function 出现不应该出现的错误:%d\n", GetLastError()); return FALSE; } memmove(pElement+i,&m_pQueue[m_nFront],sizeof(pElement)); m_nFront=(m_nFront+1)%m_nSize; ReleaseMutex(m_handle[0]); } return TRUE; } private: UINT m_uLastError; int m_iCount; HANDLE m_handle[2];//m_handle[0]为互斥句柄,m_handle[1]为信标句柄 int m_nFront;//队列头 int m_nRear;//队列尾 ElementT * m_pQueue;//对列数组 BOOL Init(int nSize)//初始化队列 { m_uLastError=0; m_handle[0]=CreateMutex(NULL,FALSE,NULL);//创建互斥句柄 m_handle[1]=CreateSemaphore(NULL,0,nSize,NULL);//创建信标 if(!m_handle[0]) { ASSERT(0); m_uLastError=9; TRACE("初始化互斥失败!\n"); return FALSE; } if(!m_handle[1]) { ASSERT(0); m_uLastError=9; TRACE("初始化信标失败!\n"); return FALSE; } m_nSize=nSize; m_pQueue=new ElementT[nSize]; if(m_pQueue==NULL) { ASSERT(0); m_uLastError=8; TRACE("生成m_pQueue空间不够\n"); } VERIFY(m_pQueue); return TRUE; } }; #endif // !defined(AFX_QUEUE_H__ECADBF81_B282_11D5_971D_0050BADA81C3__INCLUDED_)