diff options
author | Corentin Jabot <corentinjabot@gmail.com> | 2013-07-27 23:02:48 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-08-16 15:43:53 +0200 |
commit | 0d8ba7e34974fe9c1a60977a10d34413650b33b0 (patch) | |
tree | f3c0856e465ca16ca2969b5ad06f12c19e3ff06d /src/corelib/thread | |
parent | 8b86443e36bc3102e97be4f40f381151d19fd1a5 (diff) |
QThreadPool - Add method clear() to remove queued QRunnable.
QThreadPool::clear() method removes all queued QRunnable.
When a large number of long-running tasks are queud in a
QThreadPool its destruction, which calls waitForDone(), can
be quite long.
QThreadPool:clear() removes (and deletes when appropriate)
all QRunnable that have yet to be started from the queue
enabling a faster interruption.
Change-Id: Ie5d6028ad3cfe7e439d1db068c8d0936ff818db9
Reviewed-by: David Faure <david.faure@kdab.com>
Diffstat (limited to 'src/corelib/thread')
-rw-r--r-- | src/corelib/thread/qthreadpool.cpp | 27 | ||||
-rw-r--r-- | src/corelib/thread/qthreadpool.h | 2 | ||||
-rw-r--r-- | src/corelib/thread/qthreadpool_p.h | 1 |
3 files changed, 30 insertions, 0 deletions
diff --git a/src/corelib/thread/qthreadpool.cpp b/src/corelib/thread/qthreadpool.cpp index a7d52f9652..bee6790705 100644 --- a/src/corelib/thread/qthreadpool.cpp +++ b/src/corelib/thread/qthreadpool.cpp @@ -308,6 +308,18 @@ bool QThreadPoolPrivate::waitForDone(int msecs) return queue.isEmpty() && activeThreads == 0; } +void QThreadPoolPrivate::clear() +{ + QMutexLocker locker(&mutex); + for (QList<QPair<QRunnable *, int> >::const_iterator it = queue.constBegin(); + it != queue.constEnd(); ++it) { + QRunnable* r = it->first; + if (r->autoDelete() && !--r->ref) + delete r; + } + queue.clear(); +} + /*! \internal Seaches for \a runnable in the queue, removes it from the queue and @@ -609,6 +621,21 @@ bool QThreadPool::waitForDone(int msecs) return rc; } +/*! + \since 5.2 + + Removes the runnables that are not yet started from the queue. + The runnables for which \l{QRunnable::autoDelete()}{runnable->autoDelete()} + returns true are deleted. + + \sa start() +*/ +void QThreadPool::clear() +{ + Q_D(QThreadPool); + d->clear(); +} + QT_END_NAMESPACE #endif diff --git a/src/corelib/thread/qthreadpool.h b/src/corelib/thread/qthreadpool.h index ffc16dedbe..22a42c2272 100644 --- a/src/corelib/thread/qthreadpool.h +++ b/src/corelib/thread/qthreadpool.h @@ -83,6 +83,8 @@ public: void releaseThread(); bool waitForDone(int msecs = -1); + + void clear(); }; QT_END_NAMESPACE diff --git a/src/corelib/thread/qthreadpool_p.h b/src/corelib/thread/qthreadpool_p.h index 754d754e74..ba77f7e57c 100644 --- a/src/corelib/thread/qthreadpool_p.h +++ b/src/corelib/thread/qthreadpool_p.h @@ -83,6 +83,7 @@ public: void startThread(QRunnable *runnable = 0); void reset(); bool waitForDone(int msecs); + void clear(); void stealRunnable(QRunnable *); mutable QMutex mutex; |