-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathasynctaskqueue.cpp
77 lines (64 loc) · 1.9 KB
/
asynctaskqueue.cpp
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
66
67
68
69
70
71
72
73
74
75
76
#include "asynctaskqueue.h"
AsyncTaskQueue::AsyncTaskQueue(QObject *parent)
: QObject(parent)
, _poolSize(10) {
}
AsyncTaskQueue::~AsyncTaskQueue() {
}
void AsyncTaskQueue::setPoolSize(quint32 size) {
QMutexLocker locker(&_taskLock);
_poolSize = size;
while ( _pendindTasks.size() > 0 && _runningTasks.size() < _poolSize ){
quint64 nextId = _pendindTasks.dequeue();
_runningTasks.append(nextId);
_allTasks[nextId]->startAsyncTask();
}
}
void AsyncTaskQueue::addTask(AsyncTask *t) {
if (!t){
return;
}
qDebug()<< QDateTime::currentMSecsSinceEpoch() << " add new async task:"<<t->id();
QMutexLocker locker(&_taskLock);
if (_runningTasks.contains(t->id())){
return;
}
if (_pendindTasks.contains(t->id())){
return;
}
_allTasks[t->id()] = t;
if (_runningTasks.size() < _poolSize){
_runningTasks.append(t->id());
t->startAsyncTask();
} else {
_pendindTasks.enqueue(t->id());
}
}
void AsyncTaskQueue::finishTask(quint64 id) {
QMutexLocker locker(&_taskLock);
if (_runningTasks.contains(id)){
_runningTasks.removeAll(id);
}
if (_pendindTasks.contains(id)){
_pendindTasks.removeAll(id);
}
while ( _pendindTasks.size() > 0 && _runningTasks.size() < _poolSize ){
quint64 nextId = _pendindTasks.dequeue();
_runningTasks.append(nextId);
_allTasks[nextId]->startAsyncTask();
}
}
void AsyncTaskQueue::cancelTask(quint64 id) {
QMutexLocker locker(&_taskLock);
if (_runningTasks.contains(id)){
_runningTasks.removeAll(id);
}
if (_pendindTasks.contains(id)){
_pendindTasks.removeAll(id);
}
while ( _pendindTasks.size() > 0 && _runningTasks.size() < _poolSize ){
quint64 nextId = _pendindTasks.dequeue();
_runningTasks.append(nextId);
_allTasks[nextId]->startAsyncTask();
}
}