templateBOOL 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: PutMsgDescription: 向队列中加入消息 Input: T msg 消息队列节点Return: 加入成功返回TURE,否则返回FALSE*************************************************/template BOOL CToolMsgQueue ::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: GetMsgDescription: 向队列中加入消息 Input: 无 Output: T& msg 消息队列节点Return: 获取节点成功返回TURE,否则返回FALSE*************************************************/template BOOL CToolMsgQueue ::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;}