diff --git a/src/blackmisc/worker.cpp b/src/blackmisc/worker.cpp index cd751265b..9860d5114 100644 --- a/src/blackmisc/worker.cpp +++ b/src/blackmisc/worker.cpp @@ -12,8 +12,46 @@ #include +#ifdef Q_OS_WIN32 +#include +#endif + namespace BlackMisc { + void CRegularThread::run() + { +#ifdef Q_OS_WIN32 + m_handle = GetCurrentThread(); + QThread::run(); + m_handle = nullptr; +#else + QThread::run(); +#endif + } + + CRegularThread::~CRegularThread() + { +#ifdef Q_OS_WIN32 + auto handle = m_handle.load(); + if (handle) + { + auto status = WaitForSingleObject(handle, 0); + if (isRunning()) + { + switch (status) + { + default: + case WAIT_FAILED: qWarning() << "Thread" << objectName() << "unspecified error"; break; + case WAIT_OBJECT_0: qWarning() << "Thread" << objectName() << "unsafely terminated by program shutdown"; break; + case WAIT_TIMEOUT: break; + } + } + } +#endif + quit(); + wait(); + } + CWorker *CWorker::fromTaskImpl(QObject *owner, const QString &name, int typeId, std::function task) { auto *thread = new CRegularThread(owner); diff --git a/src/blackmisc/worker.h b/src/blackmisc/worker.h index 42714df7a..1b07d25f3 100644 --- a/src/blackmisc/worker.h +++ b/src/blackmisc/worker.h @@ -32,6 +32,7 @@ #include #include #include +#include namespace BlackMisc { @@ -96,11 +97,14 @@ namespace BlackMisc CRegularThread(QObject *parent = nullptr) : QThread(parent) {} //! Destructor - ~CRegularThread() - { - quit(); - wait(); - } + ~CRegularThread(); + + protected: + //! \copydoc QThread::run + virtual void run() override; + + private: + std::atomic m_handle { nullptr }; }; /*!