1 // QueueT.h: interface for the CQueueT class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #if !defined(AFX_QUEUET_H__BB664F37_5738_4439_8220_A54436AE6339__INCLUDED_) 6 #define AFX_QUEUET_H__BB664F37_5738_4439_8220_A54436AE6339__INCLUDED_ 7 8 #include "CritcalS.h" 9 10 #if _MSC_VER > 1000 11 #pragma once 12 #endif // _MSC_VER > 1000 13 14 // 循环队列: 模板类 15 16 // 要求类型 TYPE 支持默认构造函数、赋值构造函数 17 #define MAX_CMP(x,y) x>=y?x:y 18 #define MIN_CMP(x,y) x<=y?x:y 19 const int QUEUET_SIZE = 1024; //队列大小 20 template<class TYPE> 21 class CQueueT 22 { 23 public: 24 CQueueT(); 25 virtual ~CQueueT(); 26 27 int Read(TYPE *pBuf, int readBytes); 28 int GetfreeSize(); 29 int GetdataSize(); 30 int Write(const TYPE *pBuf, int writeBytes); 31 private: 32 void next(int &index); 33 TYPE pop(); 34 void push(TYPE data); 35 36 TYPE m_charArray[QUEUET_SIZE]; 37 int m_indexH; // 对列头 第一个数据位的索引值 38 int m_indexT; // 队列尾 第一个空闲位的索引值 39 40 CCritcalS m_critcal; // 临界段 41 }; 42 43 ///////////////////////////////////////////////////////////////////////////////// 44 template<class TYPE> 45 CQueueT<TYPE>::CQueueT() 46 { 47 48 } 49 50 template<class TYPE> 51 CQueueT<TYPE>::~CQueueT() 52 { 53 54 } 55 56 template<class TYPE> 57 int CQueueT<TYPE>::Write(const TYPE *pBuf, int writeBytes) 58 { 59 m_critcal.Lock(); 60 61 int sum = this->GetfreeSize(); 62 int tSize = MIN_CMP(writeBytes,sum); 63 for(int i=0;i<tSize;i++) 64 { 65 this->push(pBuf[i]); 66 } 67 68 m_critcal.Free(); 69 70 return tSize; 71 } 72 73 template<class TYPE> 74 int CQueueT<TYPE>::Read(TYPE *pBuf, int readBytes) 75 { 76 m_critcal.Lock(); 77 78 int sum = this->GetdataSize(); 79 int tSize = MIN_CMP(readBytes,sum); 80 for(int i=0;i<tSize;i++) 81 { 82 pBuf[i] = this->pop(); 83 } 84 m_critcal.Free(); 85 86 return tSize; 87 } 88 89 // 队尾入队,由外层函数做队满判断 90 template<class TYPE> 91 void CQueueT<TYPE>::push(TYPE data) 92 { 93 this->m_charArray[this->m_indexT] = data; // 94 next(this->m_indexT); 95 } 96 97 // 对头出队,有外层函数作队空判断 98 template<class TYPE> 99 TYPE CQueueT<TYPE>::pop() 100 { 101 TYPE res = this->m_charArray[this->m_indexH]; 102 next(this->m_indexH); 103 104 return res; 105 } 106 107 // 获得队列数据容量 108 template<class TYPE> 109 int CQueueT<TYPE>::GetdataSize() 110 { 111 if(m_indexT>=m_indexH) 112 { 113 return (m_indexT - m_indexH); 114 }else 115 { 116 return (m_indexT - m_indexH + QUEUET_SIZE); 117 } 118 } 119 120 // 获得队列空闲容量 121 template<class TYPE> 122 int CQueueT<TYPE>::GetfreeSize() 123 { 124 return (QUEUESIZE-this->GetdataSize() - 1); 125 } 126 127 // 索引下滑计算 128 template<class TYPE> 129 void CQueueT<TYPE>::next(int &index) 130 { 131 index = (index+1)% QUEUET_SIZE; 132 } 133 134 #endif // !defined(AFX_QUEUET_H__BB664F37_5738_4439_8220_A54436AE6339__INCLUDED_)
相关文章: