From 8117e13c151d3dfad1f56e3d7e037ac97f3d9527 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 27 Jun 2019 11:03:08 -0700 Subject: [PATCH] base task and taskmanager class --- app/core.cpp | 6 +++-- app/task/CMakeLists.txt | 2 ++ app/task/task.cpp | 47 +++++++++++++++++++++++++++++++++++++++- app/task/task.h | 39 ++++++++++++++++++++++++++++++++- app/task/taskmanager.cpp | 30 +++++++++++++++++++++++++ app/task/taskmanager.h | 13 +++++++++-- app/task/taskthread.cpp | 19 ++++++++++++++++ app/task/taskthread.h | 23 ++++++++++++++++++++ 8 files changed, 173 insertions(+), 6 deletions(-) create mode 100644 app/task/taskthread.cpp create mode 100644 app/task/taskthread.h diff --git a/app/core.cpp b/app/core.cpp index 70543fbbe..d0c3e312c 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -31,6 +31,7 @@ #include "panel/panelfocusmanager.h" #include "panel/project/project.h" #include "project/item/footage/footage.h" +#include "task/taskmanager.h" #include "ui/icons/icons.h" #include "ui/style/style.h" #include "widget/menu/menushared.h" @@ -151,9 +152,10 @@ void Core::ImportFiles(const QStringList &urls) f->set_filename(url); f->set_name(file_info.fileName()); - //file_info.lastModified(); + f->set_timestamp(file_info.lastModified()); - olive::ProbeMedia(f); + //olive::ProbeMedia(f); + olive::task_manager.AddTask(new Task()); active_project->root()->add_child(f); diff --git a/app/task/CMakeLists.txt b/app/task/CMakeLists.txt index bc0d0bb4b..f99cf323e 100644 --- a/app/task/CMakeLists.txt +++ b/app/task/CMakeLists.txt @@ -20,5 +20,7 @@ set(OLIVE_SOURCES task/task.cpp task/taskmanager.h task/taskmanager.cpp + task/taskthread.h + task/taskthread.cpp PARENT_SCOPE ) diff --git a/app/task/task.cpp b/app/task/task.cpp index 1f7b59d4f..c49ed890f 100644 --- a/app/task/task.cpp +++ b/app/task/task.cpp @@ -20,7 +20,52 @@ #include "task.h" -Task::Task() +Task::Task() : + status_(kWaiting), + thread_(this) { + connect(&thread_, SIGNAL(finished()), this, SLOT(ThreadComplete())); +} +void Task::Start() +{ + set_status(kWorking); + + thread_.start(); +} + +bool Task::Action() +{ + return true; +} + +const Task::Status &Task::status() +{ + return status_; +} + +const QString &Task::error() +{ + return error_; +} + +void Task::SetError(const QString &s) +{ + error_ = s; +} + +void Task::set_status(const Task::Status &status) +{ + status_ = status; + + emit StatusChanged(status_); +} + +void Task::ThreadComplete() +{ + if (thread_.result()) { + set_status(kFinished); + } else { + set_status(kError); + } } diff --git a/app/task/task.h b/app/task/task.h index 398c1433c..89d75b8a9 100644 --- a/app/task/task.h +++ b/app/task/task.h @@ -21,11 +21,48 @@ #ifndef TASK_H #define TASK_H +#include -class Task +#include "task/taskthread.h" + +class Task : public QObject { + Q_OBJECT public: + enum Status { + kWaiting, + kWorking, + kFinished, + kError + }; + Task(); + + void Start(); + + virtual bool Action(); + + const Status& status(); + + const QString& error(); + +protected: + void SetError(const QString& s); + +signals: + void StatusChanged(Task::Status s); + +private: + void set_status(const Status& status); + + Status status_; + + TaskThread thread_; + + QString error_; + +private slots: + void ThreadComplete(); }; #endif // TASK_H diff --git a/app/task/taskmanager.cpp b/app/task/taskmanager.cpp index 0a6f82a5e..260e17fcc 100644 --- a/app/task/taskmanager.cpp +++ b/app/task/taskmanager.cpp @@ -20,6 +20,7 @@ #include "taskmanager.h" +#include #include TaskManager olive::task_manager; @@ -28,3 +29,32 @@ TaskManager::TaskManager() { maximum_task_count_ = QThread::idealThreadCount(); } + +void TaskManager::AddTask(Task* t) +{ + connect(t, SIGNAL(StatusChanged(Task::Status)), this, SLOT(TaskCallback(Task::Status))); + + tasks_.append(t); + + if (tasks_.size() < maximum_task_count_) { + t->Start(); + } +} + +void TaskManager::TaskCallback(Task::Status status) +{ + switch (status) { + case Task::kWaiting: + qDebug() << sender() << "is waiting..."; + break; + case Task::kWorking: + qDebug() << sender() << "is working..."; + break; + case Task::kFinished: + qDebug() << sender() << "finished successfully."; + break; + case Task::kError: + qDebug() << sender() << "failed:" << static_cast(sender())->error(); + break; + } +} diff --git a/app/task/taskmanager.h b/app/task/taskmanager.h index 939c2a2c4..91a09fdf9 100644 --- a/app/task/taskmanager.h +++ b/app/task/taskmanager.h @@ -21,17 +21,26 @@ #ifndef TASKMANAGER_H #define TASKMANAGER_H +#include -class TaskManager +#include "task/task.h" + +class TaskManager : public QObject { + Q_OBJECT public: TaskManager(); - void AddTask(); + void AddTask(Task *t); private: + QVector tasks_; + int maximum_task_count_; +private slots: + void TaskCallback(Task::Status status); + }; namespace olive { diff --git a/app/task/taskthread.cpp b/app/task/taskthread.cpp new file mode 100644 index 000000000..399f35dbb --- /dev/null +++ b/app/task/taskthread.cpp @@ -0,0 +1,19 @@ +#include "taskthread.h" + +#include "task/task.h" + +TaskThread::TaskThread(Task *parent) : + parent_(parent), + result_(false) +{ +} + +void TaskThread::run() +{ + result_ = parent_->Action(); +} + +bool TaskThread::result() +{ + return result_; +} diff --git a/app/task/taskthread.h b/app/task/taskthread.h new file mode 100644 index 000000000..983b6dcac --- /dev/null +++ b/app/task/taskthread.h @@ -0,0 +1,23 @@ +#ifndef TASKTHREAD_H +#define TASKTHREAD_H + +#include + +class Task; + +class TaskThread : public QThread +{ +public: + TaskThread(Task* parent); + + virtual void run() override; + + bool result(); + +private: + Task* parent_; + + bool result_; +}; + +#endif // TASKTHREAD_H