From 6d4662aa9821ba911314eb0fe8147b84fbae7cd0 Mon Sep 17 00:00:00 2001 From: eelke Date: Mon, 25 Dec 2017 15:32:02 +0100 Subject: [PATCH] Added WorkManager to manage background tasks. Relies heavily on the QThreadPool. --- core/WorkManager.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++ core/WorkManager.h | 20 +++++++++++++++++++ core/core.pro | 6 ++++-- 3 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 core/WorkManager.cpp create mode 100644 core/WorkManager.h diff --git a/core/WorkManager.cpp b/core/WorkManager.cpp new file mode 100644 index 0000000..12d7a0a --- /dev/null +++ b/core/WorkManager.cpp @@ -0,0 +1,47 @@ +#include "WorkManager.h" + +#include +#include +#include +#include +#include + + +class WorkManagerImpl: public WorkManager { +public: + virtual void addRunnable(QRunnable *runnable) override; + virtual void addWork(Work work) override; +}; + + + +std::shared_ptr WorkManager::getWorkManager() +{ + static std::shared_ptr wm = std::make_shared(); + return wm; +} + +void WorkManagerImpl::addRunnable(QRunnable *runnable) +{ + auto tp = QThreadPool::globalInstance(); + tp->start(runnable); +} + +class CallableTask : public QRunnable { +public: + CallableTask(WorkManager::Work &&w) + : work(std::move(w)) + {} +protected: + void run() + { + work(); + } +private: + WorkManager::Work work; +}; + +void WorkManagerImpl::addWork(Work work) +{ + addRunnable(new CallableTask(std::move(work))); +} diff --git a/core/WorkManager.h b/core/WorkManager.h new file mode 100644 index 0000000..28780ae --- /dev/null +++ b/core/WorkManager.h @@ -0,0 +1,20 @@ +#ifndef WORKMANAGER_H +#define WORKMANAGER_H + +#include +#include + +class QRunnable; + +class WorkManager { +public: + + static std::shared_ptr getWorkManager(); + + using Work = std::function; + virtual void addRunnable(QRunnable *runnable) = 0; + virtual void addWork(Work work) = 0; + +}; + +#endif // WORKMANAGER_H diff --git a/core/core.pro b/core/core.pro index bbc84b9..fcf9077 100644 --- a/core/core.pro +++ b/core/core.pro @@ -38,7 +38,8 @@ SOURCES += my_boost_assert_handler.cpp \ BackupFormatModel.cpp \ QueuedBackgroundTask.cpp \ ExplainTreeModelItem.cpp \ - jsoncpp.cpp + jsoncpp.cpp \ + WorkManager.cpp HEADERS += PasswordManager.h \ SqlLexer.h \ @@ -48,7 +49,8 @@ HEADERS += PasswordManager.h \ QueuedBackgroundTask.h \ Expected.h \ ExplainTreeModelItem.h \ - json/json.h + json/json.h \ + WorkManager.h unix { target.path = /usr/lib