/*** Olive - Non-Linear Video Editor Copyright (C) 2019 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ***/ #include "taskmanager.h" #include #include TaskManager olive::task_manager; TaskManager::TaskManager() { maximum_task_count_ = QThread::idealThreadCount(); } TaskManager::~TaskManager() { Clear(); } void TaskManager::AddTask(TaskPtr t) { // Connect Task's status signal to the Callback connect(t.get(), SIGNAL(StatusChanged(Task::Status)), this, SLOT(TaskCallback(Task::Status))); // Add the Task to the queue tasks_.append(t); // Emit signal that a Task was added emit TaskAdded(t.get()); // Scan through queue and start any Tasks that can (including this one) StartNextWaiting(); } void TaskManager::Clear() { // Delete Tasks from memory for (int i=0;iCancel(); } tasks_.clear(); } 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, try to start it if (t->Start()) { // If it started, add it to the working count working_count++; } } // Check if the count exceeds our maximum threads, if so stop here if (working_count == maximum_task_count_) { break; } } } void TaskManager::DeleteTask(Task *t) { // Cancel the task t->Cancel(); // Remove instances of Task from queue for (int i=0;iRemoved(); tasks_.removeAt(i); break; } } } void TaskManager::TaskCallback(Task::Status status) { if (status == Task::kFinished || status == Task::kError) { // The Task has finished, we can start a new one StartNextWaiting(); if (status == Task::kFinished) { // The Task was successful, remove this Task from the queue DeleteTask(static_cast(sender())); } } } TaskManager::AddTaskCommand::AddTaskCommand(TaskPtr t, QUndoCommand *parent) : QUndoCommand(parent), task_(t) { } void TaskManager::AddTaskCommand::redo() { olive::task_manager.AddTask(task_); } void TaskManager::AddTaskCommand::undo() { olive::task_manager.DeleteTask(task_.get()); task_->ResetState(); }