template<typename T>
BOOL CToolMsgQueue < T> ::CreateMsgQueue(int iLength)
{
m_pMsgQueue = new(std::nothrow) T[iLength]; //分配指定长度的队列数组空间
ASSERT(m_pMsgQueue);
if (NULL == m_pMsgQueue) //如果队列创建不成功返回FALSE
{
return FALSE;
}
m_iFont = 0;
m_iRear = 0;
m_iLength = iLength;
memset(m_pMsgQueue, 0, (m_iLength * sizeof(T))); //初始化分配的队列空间
return TRUE;
}
/*************************************************
Function: PutMsg
Description: 向队列中加入消息
Input: T msg 消息队列节点
Return: 加入成功返回TURE,否则返回FALSE
*************************************************/
template<typename T>
BOOL CToolMsgQueue<T>::PutMsg(T& msg)
{
if (m_pMsgQueue == NULL) //如果消息队列创建不成功返回FALSE
{
//////TRACE("WX-//TRACE m_pMsgQueue == NULL");
return FALSE;
}
if (IsMsgQueueFull()) //如果消息队列已经满,返回FALSE
{
//////TRACE("WX-//TRACE MsgQueue Full");
return FALSE;
}
if (WaitForSingleObject(m_hMutex,1000) == WAIT_TIMEOUT) //等待互斥量,保证队列的一个节点加完后加下一个节点
{
// //OutputDebugString("WX-//TRACE MsgQueue WAIT_TIMEOUT");
return FALSE;
}
else
{
*(m_pMsgQueue + m_iRear) = msg; //把新节点加入队列
m_iRear = (m_iRear + 1) % m_iLength; //消息队列尾索引加一
if (m_bQueueEmpty == TRUE) //如果原来消息队列为空,置队列空标志为FALSE
{
m_bQueueEmpty = FALSE;
}
if (m_iRear == m_iFont) //如果队列头和对列尾索引相同置队列满标志为TRUE
{
m_bQueueFull = TRUE;
}
ReleaseMutex(m_hMutex); //释放互斥量
}
SetEvent(m_hGetMsgEvnet); //设置取消息时间对象为有信号状态
return TRUE;
}
/*************************************************
Function: GetMsg
Description: 向队列中加入消息
Input: 无
Output: T& msg 消息队列节点
Return: 获取节点成功返回TURE,否则返回FALSE
*************************************************/
template<typename T>
BOOL CToolMsgQueue<T>::GetMsg(T & msg)
{
if (m_pMsgQueue == NULL) //如果队列创建不成功返回FALSE
{
//////TRACE("WX-//TRACE m_pMsgQueue == NULL");
return FALSE;
}
if (IsMsgQueueEmpty()) //队列是否为空
{
// ASSERT(0);
//////TRACE("WX-//TRACE MsgQueue Empty");
return FALSE;
}
if (WaitForSingleObject(m_hMutex,1000) == WAIT_TIMEOUT) //等待互斥量,保证队列的一个节点加完后加下一个节点
{
// //OutputDebugString("WX-//TRACE MsgQueue WAIT_TIMEOUT");
return FALSE;
}
msg = *(m_pMsgQueue + m_iFont); //获取队列消息
m_iFont = (m_iFont + 1) % m_iLength; //队列头索引加一
if (m_iFont == m_iRear) //如果队列头和队列尾索引相等,说明队列空
{
ResetEvent(m_hGetMsgEvnet); //设置获取消息事件到无信号状态
m_bQueueEmpty = TRUE; //置队列空标志为TRUE
}
if (m_bQueueFull == TRUE) //如果队列满标志为TRUE,那么设置队列满标志为FALSE
{
m_bQueueFull = FALSE;
}
ReleaseMutex(m_hMutex);
return TRUE;
}