From 1da66ce6e975fed6f75b9411253ee19107f42e61 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 15 Mar 2020 00:35:47 +0100 Subject: [PATCH] [Worker] Stop timer in correct thread --- .../simulation/backgroundvalidation.cpp | 2 +- src/blackmisc/worker.cpp | 21 +++++++++++++++++++ src/blackmisc/worker.h | 5 ++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/blackmisc/simulation/backgroundvalidation.cpp b/src/blackmisc/simulation/backgroundvalidation.cpp index 822b62f71..a878229b6 100644 --- a/src/blackmisc/simulation/backgroundvalidation.cpp +++ b/src/blackmisc/simulation/backgroundvalidation.cpp @@ -107,7 +107,7 @@ namespace BlackMisc void CBackgroundValidation::beforeQuit() noexcept { m_wasStopped = true; // stop in utility functions - m_updateTimer.stop(); + this->stopUpdateTimer(); } void CBackgroundValidation::doWork() diff --git a/src/blackmisc/worker.cpp b/src/blackmisc/worker.cpp index 9753080fe..0536e0c5f 100644 --- a/src/blackmisc/worker.cpp +++ b/src/blackmisc/worker.cpp @@ -237,6 +237,27 @@ namespace BlackMisc } } + void CContinuousWorker::stopUpdateTimer() + { + if (!m_updateTimer.isActive()) { return; } + + // avoid "Timers cannot be stopped from another thread" + if (CThreadUtils::isCurrentThreadObjectThread(&m_updateTimer)) + { + m_updateTimer.stop(); + } + else + { + QPointer myself(this); + QTimer::singleShot(0, &m_updateTimer, [ = ] + { + // stop timer in timer thread + if (!myself) { return; } + m_updateTimer.stop(); + }); + } + } + void CContinuousWorker::finish() { this->setFinished(); diff --git a/src/blackmisc/worker.h b/src/blackmisc/worker.h index 69f463afb..9f5af21a9 100644 --- a/src/blackmisc/worker.h +++ b/src/blackmisc/worker.h @@ -334,6 +334,9 @@ namespace BlackMisc //! Wait time for quitAndWait, 0 means not waiting virtual unsigned long waitTimeoutMs() const { return 15 * 1000; } + //! Safely stop update time + void stopUpdateTimer(); + QTimer m_updateTimer { this }; //!< timer which can be used by implementing classes private: @@ -345,7 +348,7 @@ namespace BlackMisc using CWorkerBase::setFinished; QObject *m_owner = nullptr; //!< owner, parent of the QThread - QString m_name; //!< worker's name + QString m_name; //!< worker's name std::atomic m_enabled { true }; //!< marker it is enabled }; }