#pragma once
#include <qqueue.h>
#include <qmutex.h>
#include <QwaitCondition>
template<typename T>
class MySynchronizedQueue
{
public:
MySynchronizedQueue()
: requestToEnd(false)
, enqueueData(true)
, defaultSize(1000)
{
}
void enqueue(const T& data)
{
QMutexLocker lock(&mutex);
if (enqueueData)
{
updateSize();
queue.push_back(data);
condition.wakeOne();
}
}
bool dequeue(T& result)
{
QMutexLocker lock(&mutex);
while (queue.empty() && !requestToEnd)
{
condition.wait(&mutex);
}
if (requestToEnd)
{
queue.clear();
return false;
}
result = queue.dequeue();
return true;
}
void stopQueue()
{
QMutexLocker lock(&mutex);
requestToEnd = true;
condition.wakeOne();
}
unsigned int size()
{
QMutexLocker lock(&mutex);
return static_cast<unsigned int>(queue.size());
}
bool isEmpty() const
{
QMutexLocker lock(&mutex);
return queue.empty();
}
void updateSize()
{
if (queue.size() > defaultSize)
{
int popNum = queue.size() - defaultSize;
for (int i = 0; i < popNum; i++)
{
queue.dequeue();
}
}
}
void setMaxSize(int size)
{
defaultSize = size;
}
private:
QQueue<T> queue;
QMutex mutex;
QWaitCondition condition;
bool requestToEnd;
bool enqueueData;
int defaultSize;
};