diff --git a/src/blackmisc/worker.cpp b/src/blackmisc/worker.cpp index 661314254..4aeb9c848 100644 --- a/src/blackmisc/worker.cpp +++ b/src/blackmisc/worker.cpp @@ -138,25 +138,27 @@ namespace BlackMisc moveToThread(thread); connect(thread, &QThread::started, this, &CContinuousWorker::initialize); connect(thread, &QThread::finished, this, &CContinuousWorker::cleanup); - connect(thread, &QThread::finished, this, &CContinuousWorker::ps_finish); + connect(thread, &QThread::finished, this, &CContinuousWorker::finish); thread->start(priority); } void CContinuousWorker::quit() noexcept { Q_ASSERT_X(!CThreadUtils::isApplicationThreadObjectThread(this), Q_FUNC_INFO, "Try to stop main thread"); + setEnabled(false); thread()->quit(); } void CContinuousWorker::quitAndWait() noexcept { Q_ASSERT_X(!CThreadUtils::isApplicationThreadObjectThread(this), Q_FUNC_INFO, "Try to stop main thread"); + setEnabled(false); auto *ownThread = thread(); quit(); ownThread->wait(); } - void CContinuousWorker::ps_finish() + void CContinuousWorker::finish() { setFinished(); diff --git a/src/blackmisc/worker.h b/src/blackmisc/worker.h index 8bd035360..bd3b74815 100644 --- a/src/blackmisc/worker.h +++ b/src/blackmisc/worker.h @@ -289,18 +289,28 @@ namespace BlackMisc //! \threadsafe Will deadlock if called by the worker thread. virtual void quitAndWait() noexcept final override; - protected slots: + //! Enabled (running)? + //! \threadsafe + bool isEnabled() const { return m_enabled; } + + //! Enabled (running)? + //! \threadsafe + void setEnabled(bool enabled) { m_enabled = enabled; } + + protected: //! Called when the thread is started. virtual void initialize() {} //! Called when the thread is finished. virtual void cleanup() {} - private slots: - //! Called after cleanup(). - void ps_finish(); + //! Name of the worker + const QString &getName() { return m_name; } private: + //! Called after cleanup(). + void finish(); + template friend class CWorkerPointer; @@ -309,7 +319,8 @@ namespace BlackMisc using CWorkerBase::setFinished; QObject *m_owner = nullptr; - QString m_name; + QString m_name; //!< worker's name + std::atomic m_enabled { true }; //!< marker it is enabled }; /*! diff --git a/tests/blackcore/testreaders.cpp b/tests/blackcore/testreaders.cpp index 9becc86c1..60b9b197a 100644 --- a/tests/blackcore/testreaders.cpp +++ b/tests/blackcore/testreaders.cpp @@ -52,9 +52,9 @@ namespace BlackCoreTest CTestReaders::~CTestReaders() { - this->m_airportReader->gracefulShutdown(); - this->m_icaoReader->gracefulShutdown(); - this->m_modelReader->gracefulShutdown(); + this->m_airportReader->setEnabled(false); + this->m_icaoReader->setEnabled(false); + this->m_modelReader->setEnabled(false); } void CTestReaders::readIcaoData()