|
|
|
|
|
#include "GCycleQueue.h"
|
|
|
|
|
|
#include <math.h>
|
|
|
|
|
|
#include <memory.h>
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|