From 17c1742becaacd682544c39e52b2aa647483802f Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Mon, 1 Jun 2015 23:31:57 +0100 Subject: [PATCH] refs #439 CWorkerBase::waitForFinished(). --- src/blackmisc/worker.cpp | 14 ++++++++++++++ src/blackmisc/worker.h | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/src/blackmisc/worker.cpp b/src/blackmisc/worker.cpp index 30b5e5ea2..8ba220ba4 100644 --- a/src/blackmisc/worker.cpp +++ b/src/blackmisc/worker.cpp @@ -8,6 +8,7 @@ */ #include "worker.h" +#include namespace BlackMisc { @@ -40,6 +41,19 @@ namespace BlackMisc QMetaObject::invokeMethod(this, "deleteLater"); } + void CWorkerBase::waitForFinished() + { + QMutex mutex; + QMutexLocker waitCondLock(&mutex); + QWaitCondition waitCond; + { + QMutexLocker finishedLock(&m_finishedMutex); + if (m_finished) { return; } + then([ & ] { mutex.lock(); mutex.unlock(); waitCond.wakeAll(); }); + } + waitCond.wait(&mutex); + } + void CContinuousWorker::start(QThread::Priority priority) { if (m_name.isEmpty()) { m_name = metaObject()->className(); } diff --git a/src/blackmisc/worker.h b/src/blackmisc/worker.h index d734eb15c..498024942 100644 --- a/src/blackmisc/worker.h +++ b/src/blackmisc/worker.h @@ -164,6 +164,10 @@ namespace BlackMisc if (m_finished) { ifFunctor(); } else { elseFunctor(); } } + //! Blocks until the task is finished. + //! \threadsafe + void waitForFinished(); + signals: //! Emitted when the task is finished. void finished();