forked from flipperdevices/qFlipper
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathabstractoperationrunner.cpp
More file actions
65 lines (50 loc) · 1.55 KB
/
abstractoperationrunner.cpp
File metadata and controls
65 lines (50 loc) · 1.55 KB
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;
}