aboutsummaryrefslogtreecommitdiff
path: root/launcher/tasks/ConcurrentTask.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'launcher/tasks/ConcurrentTask.cpp')
-rw-r--r--launcher/tasks/ConcurrentTask.cpp30
1 files changed, 16 insertions, 14 deletions
diff --git a/launcher/tasks/ConcurrentTask.cpp b/launcher/tasks/ConcurrentTask.cpp
index ab7cbd03..484ac58e 100644
--- a/launcher/tasks/ConcurrentTask.cpp
+++ b/launcher/tasks/ConcurrentTask.cpp
@@ -37,32 +37,39 @@ void ConcurrentTask::executeTask()
{
m_total_size = m_queue.size();
- for (int i = 0; i < m_total_max_size; i++) {
+ int num_starts = std::min(m_total_max_size, m_total_size);
+ for (int i = 0; i < num_starts; i++) {
QMetaObject::invokeMethod(this, &ConcurrentTask::startNext, Qt::QueuedConnection);
}
}
bool ConcurrentTask::abort()
{
+ m_queue.clear();
+ m_aborted = true;
+
if (m_doing.isEmpty()) {
// Don't call emitAborted() here, we want to bypass the 'is the task running' check
emit aborted();
emit finished();
- m_aborted = true;
return true;
}
- m_queue.clear();
+ bool suceedeed = true;
- m_aborted = true;
- for (auto task : m_doing)
- m_aborted &= task->abort();
+ QMutableHashIterator<Task*, Task::Ptr> doing_iter(m_doing);
+ while (doing_iter.hasNext()) {
+ auto task = doing_iter.next();
+ suceedeed &= (task.value())->abort();
+ }
- if (m_aborted)
+ if (suceedeed)
emitAborted();
+ else
+ emitFailed(tr("Failed to abort all running tasks."));
- return m_aborted;
+ return suceedeed;
}
void ConcurrentTask::startNext()
@@ -70,7 +77,7 @@ void ConcurrentTask::startNext()
if (m_aborted || m_doing.count() > m_total_max_size)
return;
- if (m_queue.isEmpty() && m_doing.isEmpty()) {
+ if (m_queue.isEmpty() && m_doing.isEmpty() && !wasSuccessful()) {
emitSucceeded();
return;
}
@@ -131,11 +138,6 @@ void ConcurrentTask::subTaskStatus(const QString& msg)
void ConcurrentTask::subTaskProgress(qint64 current, qint64 total)
{
- if (total == 0) {
- setProgress(0, 100);
- return;
- }
-
m_stepProgress = current;
m_stepTotalProgress = total;
}