?? 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()操作,循環隊列操作的封裝
說明: 支持多線程
等級: ☆
****************************************************************/
template<typename ElementT>
class 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<iCount;i++)
{
fOk=FALSE;
//遞增信標
fOk=ReleaseSemaphore(m_handle[1],1,NULL);
if(!fOk) //隊列已經滿,應該不會出現
{
CString s;
m_uLastError=8;
TRACE(s);
ReleaseMutex(m_handle[0]);
return FALSE;
}
m_iCount++;
memmove(&m_pQueue[m_nRear],pElement+i,sizeof(ElementT));
m_nRear=(m_nRear+1)%m_nSize;
}
ReleaseMutex(m_handle[0]);
return TRUE;
}
BOOL Get(ElementT* pElement,DWORD dwTimeOut=INFINITE,int iCount=1)//從對隊列中取出一個元素
{
ASSERT(m_nSize);
DWORD dw;
iCount=1;//目前技術只能為1
for(int i=0;i<iCount;i++)
{
//等侍隊列里有數據
dw=WaitForMultipleObjects(2,m_handle,TRUE,dwTimeOut);
switch(dw)
{
case WAIT_OBJECT_0:
m_iCount--;
break;
case WAIT_TIMEOUT:
//TRACE("CQueue->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_)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -