diff --git a/app/core.cpp b/app/core.cpp index d0c3e312c..2fc0486dc 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -155,7 +155,11 @@ void Core::ImportFiles(const QStringList &urls) f->set_timestamp(file_info.lastModified()); //olive::ProbeMedia(f); - olive::task_manager.AddTask(new Task()); + // FIXME: Test code only + for (int i=0;i<8;i++) { + olive::task_manager.AddTask(new Task()); + } + // End test code active_project->root()->add_child(f); diff --git a/app/task/taskmanager.cpp b/app/task/taskmanager.cpp index 260e17fcc..99b2b5ef4 100644 --- a/app/task/taskmanager.cpp +++ b/app/task/taskmanager.cpp @@ -36,8 +36,30 @@ void TaskManager::AddTask(Task* t) tasks_.append(t); - if (tasks_.size() < maximum_task_count_) { - t->Start(); + StartNextWaiting(); +} + +void TaskManager::StartNextWaiting() +{ + // Count the tasks that are currently active + int working_count = 0; + + for (int i=0;istatus() == Task::kWorking) { + // Task is active, add it to the count + working_count++; + } else if (t->status() == Task::kWaiting) { + // Task is waiting and we have available threads, start it and add it to the count + t->Start(); + working_count++; + } + + // Check if the count exceeds our maximum threads, if so stop here + if (working_count == maximum_task_count_) { + break; + } } } @@ -52,9 +74,11 @@ void TaskManager::TaskCallback(Task::Status status) break; case Task::kFinished: qDebug() << sender() << "finished successfully."; + StartNextWaiting(); break; case Task::kError: qDebug() << sender() << "failed:" << static_cast(sender())->error(); + StartNextWaiting(); break; } } diff --git a/app/task/taskmanager.h b/app/task/taskmanager.h index 91a09fdf9..c504b3941 100644 --- a/app/task/taskmanager.h +++ b/app/task/taskmanager.h @@ -34,6 +34,8 @@ public: void AddTask(Task *t); private: + void StartNextWaiting(); + QVector tasks_; int maximum_task_count_;