You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

172 lines
2.5 KiB

#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();
}