/
threadpoolwithsignals.cpp
91 lines (78 loc) · 2.16 KB
/
threadpoolwithsignals.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "threadpoolwithsignals.h"
#include "controlthread.h"
#include <QDebug>
#include <QMutexLocker>
ControlThread* defaultFctory(QObject* parent){
return new ControlThread(parent);
}
ThreadPoolWithSignals::ThreadPoolWithSignals(ThreadFactory factory, QObject *parent) :
QObject(parent),tFactory(factory),cleanupTimer(this)/*,threadMutex(QMutex(QMutex::Recursive))*//*,control(new ControlThread(this))*/
{
if(!tFactory)
{
tFactory=&defaultFctory;
}
connect(&cleanupTimer,SIGNAL(timeout()),this,SLOT(cleanupIdleThreads()));
cleanupTimer.start(10000);
}
QThread* ThreadPoolWithSignals::reserveThread()
{
// QMutexLocker l(&threadMutex);
ControlThread* t;
if(!idleThreads.isEmpty())
{
t= qobject_cast<ControlThread*>(*(idleThreads.begin()));
idleThreads.remove(t);
}
else
{
t = tFactory(this);
// t->moveToThread(control.data());
connect(t, SIGNAL(finished()), t, SLOT(deleteLater()), Qt::QueuedConnection);
t->start();
allThreads.insert(t);
}
activeThreads.insert(t);
qDebug()<<"idle threads: "<<idleThreads.count()
<<" active threads: "<<activeThreads.count()
<<" total threads: "<<allThreads.count();
return t;
}
void ThreadPoolWithSignals::returnThread( QThread* t) // removes thread from active threads and adds it to inactive.
{
// QMutexLocker l(&threadMutex);
if(allThreads.contains(t))
{
activeThreads.remove(t);
idleThreads.insert(t);
}
else
qFatal("%s","ThreadPoolWithSignals::returnThread - not my thread!!!");
}
void ThreadPoolWithSignals::cleanupThreads()
{
// QMutexLocker l(&threadMutex);
QThread * t;
foreach(t,allThreads)
{
t->quit();
}
allThreads.clear();
idleThreads.clear();
activeThreads.clear();
}
void ThreadPoolWithSignals::cleanupIdleThreads()
{
// QMutexLocker l(&threadMutex);
while (idleThreads.count()>5)
{
QThread* t = *(idleThreads.begin());
idleThreads.remove(t);
allThreads.remove(t);
t->quit();
}
}
ThreadPoolWithSignals::~ThreadPoolWithSignals()
{
cleanupThreads();
}