Ensure thread is stopped before deleting QThread

PR #18037.
This commit is contained in:
Vladimir Golovnev
2022-12-08 08:37:14 +03:00
committed by GitHub
parent 31c7306bd2
commit ac3ad17a9e
18 changed files with 134 additions and 76 deletions

View File

@@ -102,15 +102,15 @@ AutoDownloader::AutoDownloader()
, m_storeSmartEpisodeFilter(u"RSS/AutoDownloader/SmartEpisodeFilter"_qs)
, m_storeDownloadRepacks(u"RSS/AutoDownloader/DownloadRepacks"_qs)
, m_processingTimer(new QTimer(this))
, m_ioThread(new QThread(this))
, m_ioThread(new QThread)
{
Q_ASSERT(!m_instance); // only one instance is allowed
m_instance = this;
m_fileStorage = new AsyncFileStorage(specialFolderLocation(SpecialFolder::Config) / Path(CONF_FOLDER_NAME));
m_fileStorage->moveToThread(m_ioThread);
connect(m_ioThread, &QThread::finished, m_fileStorage, &AsyncFileStorage::deleteLater);
m_fileStorage->moveToThread(m_ioThread.get());
connect(m_ioThread.get(), &QThread::finished, m_fileStorage, &AsyncFileStorage::deleteLater);
connect(m_fileStorage, &AsyncFileStorage::failed, [](const Path &fileName, const QString &errorString)
{
LogMsg(tr("Couldn't save RSS AutoDownloader data in %1. Error: %2")
@@ -155,9 +155,6 @@ AutoDownloader::AutoDownloader()
AutoDownloader::~AutoDownloader()
{
store();
m_ioThread->quit();
m_ioThread->wait();
}
AutoDownloader *AutoDownloader::instance()

View File

@@ -38,6 +38,7 @@
#include "base/exceptions.h"
#include "base/settingvalue.h"
#include "base/utils/thread.h"
class QThread;
class QTimer;
@@ -137,7 +138,7 @@ namespace RSS
SettingValue<bool> m_storeDownloadRepacks;
QTimer *m_processingTimer = nullptr;
QThread *m_ioThread = nullptr;
Utils::Thread::UniquePtr m_ioThread;
AsyncFileStorage *m_fileStorage = nullptr;
QHash<QString, AutoDownloadRule> m_rules;
QList<QSharedPointer<ProcessingJob>> m_processingQueue;

View File

@@ -62,14 +62,14 @@ Session::Session()
: m_storeProcessingEnabled(u"RSS/Session/EnableProcessing"_qs)
, m_storeRefreshInterval(u"RSS/Session/RefreshInterval"_qs, 30)
, m_storeMaxArticlesPerFeed(u"RSS/Session/MaxArticlesPerFeed"_qs, 50)
, m_workingThread(new QThread(this))
, m_workingThread(new QThread)
{
Q_ASSERT(!m_instance); // only one instance is allowed
m_instance = this;
m_confFileStorage = new AsyncFileStorage(specialFolderLocation(SpecialFolder::Config) / Path(CONF_FOLDER_NAME));
m_confFileStorage->moveToThread(m_workingThread);
connect(m_workingThread, &QThread::finished, m_confFileStorage, &AsyncFileStorage::deleteLater);
m_confFileStorage->moveToThread(m_workingThread.get());
connect(m_workingThread.get(), &QThread::finished, m_confFileStorage, &AsyncFileStorage::deleteLater);
connect(m_confFileStorage, &AsyncFileStorage::failed, [](const Path &fileName, const QString &errorString)
{
LogMsg(tr("Couldn't save RSS session configuration. File: \"%1\". Error: \"%2\"")
@@ -77,8 +77,8 @@ Session::Session()
});
m_dataFileStorage = new AsyncFileStorage(specialFolderLocation(SpecialFolder::Data) / Path(DATA_FOLDER_NAME));
m_dataFileStorage->moveToThread(m_workingThread);
connect(m_workingThread, &QThread::finished, m_dataFileStorage, &AsyncFileStorage::deleteLater);
m_dataFileStorage->moveToThread(m_workingThread.get());
connect(m_workingThread.get(), &QThread::finished, m_dataFileStorage, &AsyncFileStorage::deleteLater);
connect(m_dataFileStorage, &AsyncFileStorage::failed, [](const Path &fileName, const QString &errorString)
{
LogMsg(tr("Couldn't save RSS session data. File: \"%1\". Error: \"%2\"")
@@ -126,11 +126,6 @@ Session::~Session()
//store();
delete m_itemsByPath[u""_qs]; // deleting root folder
// some items may add I/O operation at destruction
// stop working thread after deleting root folder
m_workingThread->quit();
m_workingThread->wait();
qDebug() << "RSS Session deleted.";
}
@@ -487,7 +482,7 @@ void Session::setRefreshInterval(const int refreshInterval)
QThread *Session::workingThread() const
{
return m_workingThread;
return m_workingThread.get();
}
void Session::handleItemAboutToBeDestroyed(Item *item)

View File

@@ -75,6 +75,7 @@
#include "base/3rdparty/expected.hpp"
#include "base/settingvalue.h"
#include "base/utils/thread.h"
class QThread;
@@ -158,7 +159,7 @@ namespace RSS
CachedSettingValue<bool> m_storeProcessingEnabled;
CachedSettingValue<int> m_storeRefreshInterval;
CachedSettingValue<int> m_storeMaxArticlesPerFeed;
QThread *m_workingThread = nullptr;
Utils::Thread::UniquePtr m_workingThread;
AsyncFileStorage *m_confFileStorage = nullptr;
AsyncFileStorage *m_dataFileStorage = nullptr;
QTimer m_refreshTimer;