博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一种用指针方式实现队列的方式
阅读量:6587 次
发布时间:2019-06-24

本文共 3342 字,大约阅读时间需要 11 分钟。

template
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: 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;}

 

转载于:https://www.cnblogs.com/wangshaowei/p/9849830.html

你可能感兴趣的文章
boost库之智能指针
查看>>
我的友情链接
查看>>
我来自CSDN
查看>>
怎么给电脑设置IP地址和DNS地址,各系统设置IP/DNS几种方法
查看>>
必 备 习 题 集 (一)
查看>>
转:模态对话框的支持 (IE,Firefox,Chrome)
查看>>
关于图片或者文件在数据库的存储方式归纳
查看>>
Project Euler 345: Matrix Sum
查看>>
.htaccess 基础教程(四)Apache RewriteCond 规则参数
查看>>
Laravel 学习笔记5.3之 Query Builder 源码解析(下)
查看>>
2012CSDN年度博客之星评选http://vote.blog.csdn.net/item/blogstar/xyz_lmn
查看>>
AJAX 状态值(readyState)与状态码(status)详解
查看>>
BZOJ3668:[NOI2014]起床困难综合症(贪心)
查看>>
LightOJ 1245(Harmonic Number (II))
查看>>
图片转流
查看>>
HTML 标签说明
查看>>
java笔记八:IO流之字符流与字符缓冲流
查看>>
Docker 命令收集
查看>>
myeclipse注册码生成器
查看>>
iOS App间相互跳转漫谈 part2
查看>>