#include "GCycleQueue.h" #include #include #include GCycleQueue::GCycleQueue() { m_ptrFrameQueue = nullptr; m_nFront = 0; m_nTail = 0; m_nQueueSize = 10; } GCycleQueue::~GCycleQueue() { DestroyQueue(); } /* *初始化队列 */ bool GCycleQueue::InitQueue(int nQueueSize) { DestroyQueue(); //QMutexLocker lock(&m_mutex); m_mutex.lock(); m_nQueueSize = (nQueueSize > 0) ? (nQueueSize + 1) : (DEFAULT_QUEUE_SIZE + 1); //循环队列,有一个数据块为空,用于存储队列指针 m_ptrFrameQueue = new unsigned char[m_nQueueSize][MAX_FRAME_SIZE]; if(nullptr == m_ptrFrameQueue) { return false; } m_mutex.unlock(); return true; } /* *数据插入队列尾部 */ bool GCycleQueue::PushBack(Frame* pFrameData,int& nRes) { //if (m_nFrameSize != nFrameSize) //{ // return false; // } if(nullptr == pFrameData) { return false; } //QMutexLocker lock(&m_mutex); m_mutex.lock(); nRes = 0; //如果队尾与队首相同,说明队列已满,队首指针后移一位 if ((m_nTail + 1) % m_nQueueSize == m_nFront) { m_nFront++; m_nFront %= m_nQueueSize; nRes = 1; } //数据入队 memcpy(m_ptrFrameQueue[m_nTail], pFrameData, sizeof(Frame)); m_nTail++; m_nTail %= m_nQueueSize; m_mutex.unlock(); return true; } /* *从队列头部获取数据 */ bool GCycleQueue::GetFront(Frame* pFrameData) { if (IsEmpty() ) { return false; } //QMutexLocker lock(&m_mutex); m_mutex.lock(); memcpy(pFrameData, m_ptrFrameQueue[m_nFront], sizeof(Frame)); m_nFront++; m_nFront %= m_nQueueSize; m_mutex.unlock(); return true; } /* *判断队列是否为空 */ bool GCycleQueue::IsEmpty() { return !(Size() > 0); } /* *清空队列 */ void GCycleQueue::Clear() { //QMutexLocker lock(&m_mutex); m_mutex.lock(); m_nFront = 0; m_nTail = 0; m_mutex.unlock(); } /* *获取队列大小(有效数据个数) */ int GCycleQueue::Size() { int nSize = 0; // QMutexLocker lock(&m_mutex); m_mutex.lock(); if (m_nTail > m_nFront) { nSize = m_nTail - m_nFront; } else if (m_nTail < m_nFront) { nSize = m_nQueueSize + m_nTail - m_nFront; } else { nSize = 0; } m_mutex.unlock(); return nSize; } /* *销毁队列 */ void GCycleQueue::DestroyQueue() { //QMutexLocker lock(&m_mutex); m_mutex.lock(); if (nullptr != m_ptrFrameQueue) { delete [] m_ptrFrameQueue; m_ptrFrameQueue = nullptr; } m_nFront = 0; m_nTail = 0; m_mutex.unlock(); }