18#ifndef QGSTASKMANAGER_H
19#define QGSTASKMANAGER_H
25#include <QReadWriteLock>
27#include <QElapsedTimer>
33class QgsTaskRunnableWrapper;
74 CancelWithoutPrompt = 1 << 2,
100 void setDescription(
const QString &description );
111 bool isActive()
const {
return mOverallStatus == Running; }
135 qint64 elapsedTime()
const;
146 virtual void cancel();
168 SubTaskIndependent = 0,
193 SubTaskDependency subTaskDependency = SubTaskIndependent );
200 void setDependentLayers(
const QList<QgsMapLayer *> &dependentLayers );
207 QList< QgsMapLayer * > dependentLayers()
const;
218 bool waitForFinished(
int timeout = 30000 );
283 virtual void finished(
bool result ) { Q_UNUSED( result ) }
290 bool isCanceled()
const;
299 void setProgress(
double progress );
302 void subTaskStatusChanged(
int status );
307 QString mDescription;
309 TaskStatus mStatus = Queued;
311 TaskStatus mOverallStatus = Queued;
317 QMutex mNotFinishedMutex;
323 QSemaphore mNotStartedMutex;
326 double mProgress = 0.0;
328 double mTotalProgress = 0.0;
329 bool mShouldTerminate =
false;
330 mutable QMutex mShouldTerminateMutex;
335 SubTask(
QgsTask *task,
const QgsTaskList &dependencies, SubTaskDependency dependency )
337 , dependencies( dependencies )
338 , dependency( dependency )
342 SubTaskDependency dependency;
344 QList< SubTask > mSubTasks;
348 QElapsedTimer mElapsedTime;
367 void processSubTasksForHold();
371 friend class QgsTaskRunnableWrapper;
372 friend class TestQgsTaskManager;
376 void processSubTasksForCompletion();
378 void processSubTasksForTermination();
417 , dependentTasks( dependentTasks )
437 QThreadPool *threadPool();
464 QgsTask *task(
long id )
const;
469 QList<QgsTask *> tasks()
const;
479 long taskId(
QgsTask *task )
const;
489 bool dependenciesSatisfied(
long taskId )
const;
495 QSet< long > dependencies(
long taskId )
const SIP_SKIP;
504 QList< QgsMapLayer * > dependentLayers(
long taskId )
const;
510 QList< QgsTask * > tasksDependentOnLayer(
QgsMapLayer *layer )
const;
516 QList< QgsTask * > activeTasks()
const;
526 int countActiveTasks(
bool includeHidden =
true )
const;
534 void triggerTask(
QgsTask *task );
593 void taskProgressChanged(
double progress );
594 void taskStatusChanged(
int status );
595 void layersWillBeRemoved(
const QList<QgsMapLayer *> &layers );
601 TaskInfo(
QgsTask *task =
nullptr,
int priority = 0 );
602 void createRunnable();
606 QgsTaskRunnableWrapper *runnable =
nullptr;
609 QThreadPool *mThreadPool =
nullptr;
611 bool mInitialized =
false;
613 mutable QRecursiveMutex *mTaskMutex;
615 QMap< long, TaskInfo > mTasks;
616 QMap< QgsTask *, long> mMapTaskPtrToId;
617 QMap< long, QgsTaskList > mTaskDependencies;
618 QMap< long, QgsWeakMapLayerPointerList > mLayerDependencies;
621 long mNextTaskId = 1;
624 QSet< QgsTask * > mActiveTasks;
626 QSet< QgsTask * > mParentTasks;
628 QSet< QgsTask * > mSubTasks;
630 QSet< QgsTask * > mPendingDeletion;
632 long addTaskPrivate(
QgsTask *task,
637 bool cleanupAndDeleteTask(
QgsTask *task );
650 void cancelDependentTasks(
long taskId );
652 bool resolveDependencies(
long taskId, QSet< long > &results )
const;
655 bool hasCircularDependencies(
long taskId )
const;
657 friend class TestQgsTaskManager;
690 void cancel()
override;
Base class for all map layer types.
Task manager for managing a set of long-running QgsTask tasks.
void finalTaskProgressChanged(double progress)
Will be emitted when only a single task remains to complete and that task has reported a progress cha...
void statusChanged(long taskId, int status)
Will be emitted when a task reports a status change.
void taskAdded(long taskId)
Emitted when a new task has been added to the manager.
void taskAboutToBeDeleted(long taskId)
Emitted when a task is about to be deleted.
void allTasksFinished()
Emitted when all tasks are complete.
void progressChanged(long taskId, double progress)
Will be emitted when a task reports a progress change.
void countActiveTasksChanged(int count)
Emitted when the number of active tasks changes.
void taskTriggered(QgsTask *task)
Emitted when a task is triggered.
Task that is composed of sub-tasks to be executed in a serial way, which may be useful for example to...
QList< QgsTask * > mSubTasksSerial
QgsTaskWithSerialSubTasks(const QString &desc=QString())
Constructor.
Abstract base class for long running background tasks.
TaskStatus status() const
Returns the current task status.
Flags flags() const
Returns the flags associated with the task.
void taskCompleted()
Will be emitted by task to indicate its successful completion.
double progress() const
Returns the task's progress (between 0.0 and 100.0)
virtual void finished(bool result)
If the task is managed by a QgsTaskManager, this will be called after the task has finished (whether ...
virtual bool run()=0
Performs the task's operation.
void progressChanged(double progress)
Will be emitted by task when its progress changes.
void begun()
Will be emitted by task to indicate its commencement.
bool isActive() const
Returns true if the task is active, ie it is not complete and has not been canceled.
void taskTerminated()
Will be emitted by task if it has terminated for any reason other then completion (e....
void statusChanged(int status)
Will be emitted by task when its status changes.
TaskStatus
Status of tasks.
@ Terminated
Task was terminated or errored.
@ Queued
Task is queued and has not begun.
@ OnHold
Task is queued but on hold and will not be started.
@ Running
Task is currently running.
@ Complete
Task successfully completed.
QString description() const
Returns the task's description.
SubTaskDependency
Controls how subtasks relate to their parent task.
@ ParentDependsOnSubTask
Subtask must complete before parent can begin.
bool canCancel() const
Returns true if the task can be canceled.
#define SIP_ENUM_BASETYPE(type)
QList< QgsWeakMapLayerPointer > QgsWeakMapLayerPointerList
A list of weak pointers to QgsMapLayers.
QList< QgsTask * > QgsTaskList
List of QgsTask objects.
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsTextRendererUtils::CurvedTextFlags)
Definition of a task for inclusion in the manager.
TaskDefinition(QgsTask *task, const QgsTaskList &dependentTasks=QgsTaskList())
Constructor for TaskDefinition.
QgsTaskList dependentTasks
List of dependent tasks which must be completed before task can run.