From d2061a69a59ae952d88e64e0cb996208068fbb92 Mon Sep 17 00:00:00 2001 From: Nikhil Tanwar <2002nikhiltanwar@gmail.com> Date: Mon, 3 Jul 2023 18:55:31 +0530 Subject: [PATCH] do remote library update in a different thread Put updateRemoteLibrary in a new thread so it doesn't block the main UI, particularly the loader widget --- src/contentmanager.cpp | 17 ++++++++++++----- src/contentmanager.h | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/contentmanager.cpp b/src/contentmanager.cpp index 27fb367..0ea1c79 100644 --- a/src/contentmanager.cpp +++ b/src/contentmanager.cpp @@ -18,6 +18,7 @@ #include "contentmanagerdelegate.h" #include "node.h" #include "kiwixconfirmbox.h" +#include ContentManager::ContentManager(Library* library, kiwix::Downloader* downloader, QObject *parent) : QObject(parent), @@ -157,6 +158,7 @@ QMap ContentManager::getBookInfos(QString id, const QStringLi return &mp_library->getBookById(id); } catch (...) { try { + QMutexLocker locker(&remoteLibraryLocker); return &m_remoteLibrary.getBookById(id.toStdString()); } catch(...) { return nullptr; } } @@ -345,6 +347,7 @@ QString ContentManager::downloadBook(const QString &id) return ""; const auto& book = [&]()->const kiwix::Book& { try { + QMutexLocker locker(&remoteLibraryLocker); return m_remoteLibrary.getBookById(id.toStdString()); } catch (...) { return mp_library->getBookById(id); @@ -536,11 +539,14 @@ void ContentManager::updateLibrary() { #define CATALOG_URL "library.kiwix.org" void ContentManager::updateRemoteLibrary(const QString& content) { - m_remoteLibrary = kiwix::Library(); - kiwix::Manager manager(&m_remoteLibrary); - manager.readOpds(content.toStdString(), CATALOG_URL); - emit(this->booksChanged()); - emit(this->pendingRequest(false)); + QtConcurrent::run([=]() { + QMutexLocker locker(&remoteLibraryLocker); + m_remoteLibrary = kiwix::Library(); + kiwix::Manager manager(&m_remoteLibrary); + manager.readOpds(content.toStdString(), CATALOG_URL); + emit(this->booksChanged()); + emit(this->pendingRequest(false)); + }); } void ContentManager::setSearch(const QString &search) @@ -586,6 +592,7 @@ QStringList ContentManager::getBookIds() return mp_library->listBookIds(filter, m_sortBy, m_sortOrderAsc); } else { filter.remote(true); + QMutexLocker locker(&remoteLibraryLocker); auto bookIds = m_remoteLibrary.filter(filter); m_remoteLibrary.sort(bookIds, m_sortBy, m_sortOrderAsc); QStringList list; diff --git a/src/contentmanager.h b/src/contentmanager.h index e351b41..1d093a4 100644 --- a/src/contentmanager.h +++ b/src/contentmanager.h @@ -47,6 +47,7 @@ private: void eraseBookFilesFromComputer(const QString dirPath, const QString filename); QList> getBooksList(); ContentManagerModel *managerModel; + QMutex remoteLibraryLocker; signals: void filterParamsChanged();