-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathsynctaskqueue.h
89 lines (64 loc) · 1.41 KB
/
synctaskqueue.h
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
77
78
79
80
81
82
83
84
85
86
87
88
89
#ifndef WORKER_H
#define WORKER_H
#include <QObject>
#include <QtCore>
// 抽象任务
class Task {
public:
Task() {
static quint64 sequence = 0;
_id = ++sequence;
}
~Task(){ qDebug()<<"~Task() "<<_id; }
inline quint64 id() { return _id; }
virtual void process() = 0;
virtual void finish() = 0;
private:
// 只作为 标记,不做为 唯一 ID
quint64 _id;
};
// worker
class Worker : public QObject {
Q_OBJECT
public:
explicit Worker(QObject *parent = nullptr);
public: // api
quint64 addTask(Task *t);
void cancelTask(quint64 id);
signals:
void startWork();
void finishWork(Task *t, bool hasLeft);
public slots:
void onTaskAdded();
private:
QMutex _taskMutex;
QQueue<Task *> _taskList;
};
class Thread : public QThread{
Q_OBJECT
public:
Thread(QObject *parent = nullptr) : QThread(parent){}
~Thread(){
requestInterruption();
quit();
wait();
qDebug()<<"~Thread()";
}
};
class TaskQueue : public QObject{
Q_OBJECT
public:
explicit TaskQueue(QObject *parent = nullptr);
~TaskQueue();
quint64 addTask(Task *t);
void cancelTask(quint64 id);
public slots:
void onTaskFinished(Task *t, bool hasLeft);
void onThreadInIdle();
private:
QMutex _threadIdleMutex;
QTimer _threadIdleTimer;
Thread *_thread;
Worker *_worker;
};
#endif // WORKER_H