diff options
author | saturneric <[email protected]> | 2024-01-12 06:02:37 +0000 |
---|---|---|
committer | saturneric <[email protected]> | 2024-01-12 06:02:37 +0000 |
commit | bf538056b24a68b8fd235b1c50991ee8eb46a776 (patch) | |
tree | e1bab54095b80df62b321fb5bd69453f9f951b05 /src/core/thread/TaskRunner.cpp | |
parent | feat: improve api and ui of keys import and export (diff) | |
download | GpgFrontend-bf538056b24a68b8fd235b1c50991ee8eb46a776.tar.gz GpgFrontend-bf538056b24a68b8fd235b1c50991ee8eb46a776.zip |
refactor: use QString instead of std::string and improve threading system
Diffstat (limited to 'src/core/thread/TaskRunner.cpp')
-rw-r--r-- | src/core/thread/TaskRunner.cpp | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/src/core/thread/TaskRunner.cpp b/src/core/thread/TaskRunner.cpp index dbd14225..19587e70 100644 --- a/src/core/thread/TaskRunner.cpp +++ b/src/core/thread/TaskRunner.cpp @@ -28,12 +28,6 @@ #include "core/thread/TaskRunner.h" -#include <QtConcurrent> -#include <boost/uuid/uuid.hpp> -#include <boost/uuid/uuid_generators.hpp> -#include <boost/uuid/uuid_io.hpp> -#include <utility> - #include "core/thread/Task.h" namespace GpgFrontend::Thread { @@ -56,7 +50,32 @@ class TaskRunner::Impl : public QThread { task->SafelyRun(); } - void PostTask(const std::string& name, const Task::TaskRunnable& runnerable, + std::tuple<QPointer<Task>, Task::TaskTrigger> RegisterTask( + const QString& name, const Task::TaskRunnable& runnerable, + const Task::TaskCallback& cb, DataObjectPtr params) { + auto raw_task = SecureCreateQSharedObject<Task>(runnerable, name, + std::move(params), cb); + raw_task->setParent(nullptr); + raw_task->moveToThread(this); + + connect(raw_task.get(), &Task::SignalRun, this, [this, raw_task]() { + pending_tasks_[raw_task->GetFullID()] = raw_task; + }); + + connect(raw_task.get(), &Task::SignalTaskEnd, this, [this, raw_task]() { + pending_tasks_.remove(raw_task->GetFullID()); + }); + + GF_CORE_LOG_TRACE("runner starts task: {} at thread: {}", + raw_task->GetFullID(), this->currentThreadId()); + + QPointer<Task> const task = raw_task.get(); + return {nullptr, [task]() { + if (task != nullptr) task->SafelyRun(); + }}; + } + + void PostTask(const QString& name, const Task::TaskRunnable& runnerable, const Task::TaskCallback& cb, DataObjectPtr params) { PostTask(new Task(runnerable, name, std::move(params), cb)); } @@ -89,9 +108,7 @@ class TaskRunner::Impl : public QThread { } private: - static auto generate_uuid() -> std::string { - return boost::uuids::to_string(boost::uuids::random_generator()()); - } + QMap<QString, QSharedPointer<Task>> pending_tasks_; }; TaskRunner::TaskRunner() : p_(SecureCreateUniqueObject<Impl>()) {} @@ -104,8 +121,7 @@ TaskRunner::~TaskRunner() { void TaskRunner::PostTask(Task* task) { p_->PostTask(task); } -void TaskRunner::PostTask(const std::string& name, - const Task::TaskRunnable& runner, +void TaskRunner::PostTask(const QString& name, const Task::TaskRunnable& runner, const Task::TaskCallback& cb, DataObjectPtr params) { p_->PostTask(name, runner, cb, std::move(params)); } @@ -129,4 +145,9 @@ auto TaskRunner::GetThread() -> QThread* { return p_.get(); } auto TaskRunner::IsRunning() -> bool { return p_->isRunning(); } +std::tuple<QPointer<Task>, Task::TaskTrigger> TaskRunner::RegisterTask( + const QString& name, const Task::TaskRunnable& runnable, + const Task::TaskCallback& cb, DataObjectPtr p_pbj) { + return p_->RegisterTask(name, runnable, cb, p_pbj); +} } // namespace GpgFrontend::Thread |