1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
#include "abstractoperationrunner.h"
#include <QTimer>
#include <QDebug>
#include <QLoggingCategory>
#include "abstractoperation.h"
Q_LOGGING_CATEGORY(CATEGORY_DEFAULT, "DEF")
AbstractOperationRunner::AbstractOperationRunner(QObject *parent):
QObject(parent),
m_state(Idle)
{}
const QLoggingCategory &AbstractOperationRunner::loggingCategory() const
{
return CATEGORY_DEFAULT();
}
void AbstractOperationRunner::enqueueOperation(AbstractOperation *operation)
{
if(m_state == Idle) {
m_state = Running;
QTimer::singleShot(0, this, &AbstractOperationRunner::processQueue);
}
connect(operation, &AbstractOperation::finished, this, [=]() {
if(operation->isError()) {
qCCritical(loggingCategory()).noquote() << operation->description() << "ERROR:" << operation->errorString();
clearQueue();
processQueue();
} else {
qCInfo(loggingCategory()).noquote() << operation->description() << "SUCCESS";
QTimer::singleShot(0, this, &AbstractOperationRunner::processQueue);
}
operation->deleteLater();
});
m_queue.enqueue(operation);
}
void AbstractOperationRunner::processQueue()
{
if(m_queue.isEmpty()) {
m_state = Idle;
return;
}
auto *operation = m_queue.dequeue();
qCInfo(loggingCategory()).noquote() << operation->description() << "START";
operation->start();
}
void AbstractOperationRunner::clearQueue()
{
while(!m_queue.isEmpty()) {
m_queue.dequeue()->deleteLater();
}
m_state = Idle;
}
|