2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* \ingroup core
|
2016-04-15 07:35:22 +10:00
|
|
|
* \class QgsTask
|
2016-11-03 08:19:33 +10:00
|
|
|
* \brief Abstract base class for long running background tasks. Tasks can be controlled directly,
|
|
|
|
* or added to a QgsTaskManager for automatic management.
|
|
|
|
*
|
|
|
|
* Derived classes should implement the process they want to execute in the background
|
|
|
|
* within the run() method. This method will be called when the
|
|
|
|
* task commences (ie via calling start() ).
|
|
|
|
*
|
|
|
|
* Long running tasks should periodically check the isCancelled() flag to detect if the task
|
|
|
|
* has been cancelled via some external event. If this flag is true then the task should
|
|
|
|
* clean up and terminate at the earliest possible convenience.
|
|
|
|
*
|
|
|
|
* \note Added in version 3.0
|
2016-04-15 07:35:22 +10:00
|
|
|
*/
|
2016-12-05 12:20:06 +10:00
|
|
|
class QgsTask : QObject
|
2016-04-15 07:35:22 +10:00
|
|
|
{
|
|
|
|
|
|
|
|
%TypeHeaderCode
|
|
|
|
#include <qgstaskmanager.h>
|
|
|
|
%End
|
|
|
|
public:
|
|
|
|
|
|
|
|
//! Status of tasks
|
|
|
|
enum TaskStatus
|
|
|
|
{
|
2016-04-15 20:49:02 +10:00
|
|
|
Queued, /*!< Task is queued and has not begun */
|
2016-04-21 10:42:51 +10:00
|
|
|
OnHold, /*!< Task is queued but on hold and will not be started */
|
2016-04-15 07:35:22 +10:00
|
|
|
Running, /*!< Task is currently running */
|
|
|
|
Complete, /*!< Task successfully completed */
|
|
|
|
Terminated, /*!< Task was terminated or errored */
|
|
|
|
};
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
//! Result of running the task
|
|
|
|
enum TaskResult
|
|
|
|
{
|
|
|
|
ResultSuccess, //!< Task completed successfully
|
|
|
|
ResultFail, //!< Task was terminated within completion
|
|
|
|
ResultPending, //!< Task is still running
|
|
|
|
};
|
|
|
|
|
2016-04-19 22:24:34 +10:00
|
|
|
//! Task flags
|
|
|
|
enum Flag
|
|
|
|
{
|
2016-04-20 07:22:38 +10:00
|
|
|
CanCancel, //!< Task can be cancelled
|
2016-04-19 22:24:34 +10:00
|
|
|
AllFlags, //!< Task supports all flags
|
|
|
|
};
|
|
|
|
typedef QFlags<QgsTask::Flag> Flags;
|
|
|
|
|
2016-11-03 08:31:27 +10:00
|
|
|
/**
|
2016-11-03 08:19:33 +10:00
|
|
|
* Constructor for QgsTask.
|
2016-04-15 07:35:22 +10:00
|
|
|
* @param description text description of task
|
2016-04-19 22:24:34 +10:00
|
|
|
* @param flags task flags
|
2016-04-15 07:35:22 +10:00
|
|
|
*/
|
2016-04-19 22:24:34 +10:00
|
|
|
QgsTask( const QString& description = QString(), const Flags& flags = AllFlags );
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Returns the flags associated with the task.
|
|
|
|
*/
|
2016-04-19 22:24:34 +10:00
|
|
|
Flags flags() const;
|
2016-04-15 07:35:22 +10:00
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Returns true if the task can be cancelled.
|
|
|
|
*/
|
2016-04-19 22:24:34 +10:00
|
|
|
bool canCancel() const;
|
2016-04-15 07:35:22 +10:00
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Returns true if the task is active, ie it is not complete and has
|
|
|
|
* not been cancelled.
|
|
|
|
*/
|
2016-04-15 07:35:22 +10:00
|
|
|
bool isActive() const;
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Returns the current task status.
|
|
|
|
*/
|
2016-04-15 07:35:22 +10:00
|
|
|
TaskStatus status() const;
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Returns the task's description.
|
|
|
|
*/
|
2016-04-15 07:35:22 +10:00
|
|
|
QString description() const;
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Returns the task's progress (between 0.0 and 100.0)
|
|
|
|
*/
|
2016-04-15 07:35:22 +10:00
|
|
|
double progress() const;
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
2016-11-25 18:15:08 +10:00
|
|
|
* Notifies the task that it should terminate. Calling this is not guaranteed
|
2016-11-03 08:19:33 +10:00
|
|
|
* to immediately end the task, rather it sets the isCancelled() flag which
|
|
|
|
* task subclasses can check and terminate their operations at an appropriate
|
2016-11-25 18:15:08 +10:00
|
|
|
* time. Any subtasks owned by this task will also be cancelled.
|
2016-11-03 08:19:33 +10:00
|
|
|
* @see isCancelled()
|
|
|
|
*/
|
2016-04-20 07:22:38 +10:00
|
|
|
void cancel();
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Places the task on hold. If the task in not queued
|
|
|
|
* (ie it is already running or has finished) then calling this has no effect.
|
|
|
|
* Calling this method only has an effect for tasks which are managed
|
|
|
|
* by a QgsTaskManager.
|
|
|
|
* @see unhold()
|
|
|
|
*/
|
2016-04-21 10:42:51 +10:00
|
|
|
void hold();
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Releases the task from being held. For tasks managed by a QgsTaskManager
|
|
|
|
* calling this will re-add them to the queue. If the
|
|
|
|
* task in not currently being held then calling this has no effect.
|
|
|
|
* @see hold()
|
|
|
|
*/
|
2016-04-21 10:42:51 +10:00
|
|
|
void unhold();
|
|
|
|
|
2016-11-25 18:15:08 +10:00
|
|
|
//! Controls how subtasks relate to their parent task
|
|
|
|
enum SubTaskDependency
|
|
|
|
{
|
|
|
|
SubTaskIndependent, //!< Subtask is independent of the parent, and can run before, after or at the same time as the parent.
|
|
|
|
ParentDependsOnSubTask, //!< Subtask must complete before parent can begin
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds a subtask to this task.
|
|
|
|
*
|
|
|
|
* Subtasks allow a single task to be created which
|
|
|
|
* consists of multiple smaller tasks. Subtasks are not visible or indepedently
|
|
|
|
* controllable by users. Ownership of the subtask is transferred.
|
|
|
|
* Subtasks can have an optional list of dependant tasks, which must be completed
|
|
|
|
* before the subtask can begin. By default subtasks are considered independent
|
|
|
|
* of the parent task, ie they can be run either before, after, or at the same
|
|
|
|
* time as the parent task. This behaviour can be overriden through the subTaskDependency
|
|
|
|
* argument.
|
|
|
|
*
|
|
|
|
* The parent task must be added to a QgsTaskManager for subtasks to be utilised.
|
|
|
|
* Subtasks should not be added manually to a QgsTaskManager, rather, only the parent
|
|
|
|
* task should be added to the manager.
|
|
|
|
*
|
|
|
|
* Subtasks can be nested, ie a subtask can legally be a parent task itself with
|
|
|
|
* its own set of subtasks.
|
|
|
|
*/
|
|
|
|
void addSubTask( QgsTask* subTask /Transfer/, const QgsTaskList& dependencies = QgsTaskList(),
|
|
|
|
SubTaskDependency subTaskDependency = SubTaskIndependent );
|
|
|
|
|
2016-04-15 07:35:22 +10:00
|
|
|
signals:
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Will be emitted by task when its progress changes.
|
|
|
|
* @param progress percent of progress, from 0.0 - 100.0
|
|
|
|
* @note derived classes should not emit this signal directly, instead they should call
|
|
|
|
* setProgress()
|
|
|
|
*/
|
2016-04-15 07:35:22 +10:00
|
|
|
void progressChanged( double progress );
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Will be emitted by task when its status changes.
|
|
|
|
* @param status new task status
|
|
|
|
* @note derived classes should not emit this signal directly, instead they should call
|
2016-11-03 08:31:27 +10:00
|
|
|
* completed() or terminated()
|
2016-11-03 08:19:33 +10:00
|
|
|
*/
|
2016-04-15 07:35:22 +10:00
|
|
|
void statusChanged( int status );
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Will be emitted by task to indicate its commencement.
|
|
|
|
* @note derived classes should not emit this signal directly, it will automatically
|
|
|
|
* be emitted when the task begins
|
|
|
|
*/
|
2016-04-15 20:49:02 +10:00
|
|
|
void begun();
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Will be emitted by task to indicate its successful completion.
|
|
|
|
* @note derived classes should not emit this signal directly, instead they should call
|
|
|
|
* completed()
|
|
|
|
*/
|
2016-04-15 07:35:22 +10:00
|
|
|
void taskCompleted();
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Will be emitted by task if it has terminated for any reason
|
|
|
|
* other then completion (eg when a task has been cancelled or encountered
|
|
|
|
* an internal error).
|
|
|
|
* @note derived classes should not emit this signal directly, instead they should call
|
2016-11-03 08:31:27 +10:00
|
|
|
* terminated()
|
2016-11-03 08:19:33 +10:00
|
|
|
*/
|
2016-11-03 08:31:27 +10:00
|
|
|
void taskTerminated();
|
2016-04-15 07:35:22 +10:00
|
|
|
|
2016-04-15 20:49:02 +10:00
|
|
|
protected:
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Performs the task's operation. This method will be called when the task commences
|
|
|
|
* (ie via calling start() ), and subclasses should implement the operation they
|
|
|
|
* wish to perform in the background within this method.
|
|
|
|
*
|
|
|
|
* A task can return a ResultSuccess and ResultFail value to indicate that the
|
|
|
|
* task has finished and was either completed successfully or terminated before
|
|
|
|
* completion.
|
|
|
|
*
|
|
|
|
* Alternatively, tasks can also return the ResultPending value
|
|
|
|
* to indicate that the task is still operating and will manually report its
|
2016-11-03 08:31:27 +10:00
|
|
|
* completion by calling completed() or terminated(). This may be useful for
|
2016-11-03 08:19:33 +10:00
|
|
|
* tasks which rely on external events for completion, eg downloading a
|
|
|
|
* file. In this case Qt slots could be created which are connected to the
|
2016-11-03 08:31:27 +10:00
|
|
|
* download completion or termination and which call completed() or terminated()
|
2016-11-03 08:19:33 +10:00
|
|
|
* to indicate the task has finished operations.
|
|
|
|
* @see completed()
|
2016-11-03 08:31:27 +10:00
|
|
|
* @see terminated()
|
2016-11-03 08:19:33 +10:00
|
|
|
*/
|
2016-12-05 12:20:06 +10:00
|
|
|
virtual TaskResult run() = 0;
|
2016-04-15 20:49:02 +10:00
|
|
|
|
Allow QgsTask subclasses to defined a finished function, which is
called when the task has completed (successfully or otherwise).
This allows for simpler task design when the signal/slot
based approach is not required. Just implement run() with your
heavy lifting, and finished() to do whatever follow up stuff
should happen after the task is complete. finished is always
called from the main thread, so it's safe to do GUI operations
here.
Python based tasks using the simplified QgsTask.fromFunction
approach can now set a on_finished argument to a function
to call when the task is complete.
eg:
def calculate(task):
# pretend this is some complex maths and stuff we want
# to run in the background
return 5*6
def calculation_finished(result, value=None):
if result == QgsTask.ResultSuccess:
iface.messageBar().pushMessage(
'the magic number is {}'.format(value))
elif result == QgsTask.ResultFail:
iface.messageBar().pushMessage(
'couldn\'t work it out, sorry')
task = QgsTask.fromFunction('my task', calculate,
on_finished=calculation_finished)
QgsTaskManager.instance().addTask(task)
Multiple values can also be returned, eg:
def calculate(task):
return (4, 8, 15)
def calculation_finished(result, count=None, max=None, sum=None):
# here:
# count = 4
# max = 8
# sum = 15
task = QgsTask.fromFunction('my task', calculate,
on_finished=calculation_finished)
QgsTaskManager.instance().addTask(task)
2016-11-09 10:10:57 +10:00
|
|
|
/**
|
|
|
|
* If the task is managed by a QgsTaskManager, this will be called after the
|
|
|
|
* task has finished (whether through successful completion or via early
|
|
|
|
* termination). The result argument reflects whether
|
|
|
|
* the task was successfully completed or not. This method is always called
|
|
|
|
* from the main thread, so it is safe to create widgets and perform other
|
|
|
|
* operations which require the main thread. However, the GUI will be blocked
|
|
|
|
* for the duration of this method so tasks should avoid performing any
|
|
|
|
* lengthy operations here.
|
|
|
|
*/
|
|
|
|
virtual void finished( TaskResult result );
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Will return true if task should terminate ASAP. If the task reports the CanCancel
|
|
|
|
* flag, then derived classes' run() methods should periodically check this and
|
|
|
|
* terminate in a safe manner.
|
|
|
|
*/
|
2016-04-15 20:49:02 +10:00
|
|
|
bool isCancelled() const;
|
|
|
|
|
2016-11-03 08:19:33 +10:00
|
|
|
/**
|
|
|
|
* Sets the task as completed. Calling this is only required for tasks which
|
|
|
|
* returned the ResultPending value as a result of run(). This should be called
|
|
|
|
* when the task is complete. Calling will automatically emit the statusChanged
|
|
|
|
* and taskCompleted signals.
|
|
|
|
*/
|
|
|
|
void completed();
|
|
|
|
|
|
|
|
/**
|
2016-11-03 08:31:27 +10:00
|
|
|
* Sets the task as terminated. Calling this is only required for tasks which
|
2016-11-03 08:19:33 +10:00
|
|
|
* returned the ResultPending value as a result of run().
|
|
|
|
* Should be called whenever the task ends for any reason other than successful
|
2016-11-03 08:31:27 +10:00
|
|
|
* completion. Calling will automatically emit the statusChanged and taskTerminated
|
2016-11-03 08:19:33 +10:00
|
|
|
* signals.
|
|
|
|
*/
|
2016-11-03 08:31:27 +10:00
|
|
|
void terminated();
|
2016-11-03 08:19:33 +10:00
|
|
|
|
|
|
|
protected slots:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the task's current progress. If task reports the CanReportProgress flag then
|
|
|
|
* the derived class should call this method whenever the task wants to update its
|
|
|
|
* progress. Calling will automatically emit the progressChanged signal.
|
|
|
|
* @param progress percent of progress, from 0.0 - 100.0
|
|
|
|
*/
|
|
|
|
void setProgress( double progress );
|
|
|
|
|
2016-04-15 07:35:22 +10:00
|
|
|
};
|
|
|
|
|
2016-04-19 22:24:34 +10:00
|
|
|
QFlags<QgsTask::Flag> operator|(QgsTask::Flag f1, QFlags<QgsTask::Flag> f2);
|
|
|
|
|
2016-04-21 11:41:00 +10:00
|
|
|
//! List of QgsTask objects
|
|
|
|
typedef QList< QgsTask* > QgsTaskList;
|
|
|
|
|
2016-04-15 07:35:22 +10:00
|
|
|
/** \ingroup core
|
|
|
|
* \class QgsTaskManager
|
|
|
|
* \brief Task manager for managing a set of long-running QgsTask tasks. This class can be created directly,
|
|
|
|
* or accessed via a global instance.
|
|
|
|
* \note Added in version 2.16
|
|
|
|
*/
|
|
|
|
class QgsTaskManager : QObject
|
|
|
|
{
|
|
|
|
%TypeHeaderCode
|
|
|
|
#include <qgstaskmanager.h>
|
|
|
|
%End
|
|
|
|
public:
|
|
|
|
|
|
|
|
/** Constructor for QgsTaskManager.
|
|
|
|
* @param parent parent QObject
|
|
|
|
*/
|
|
|
|
QgsTaskManager( QObject* parent /TransferThis/ = nullptr );
|
|
|
|
|
|
|
|
virtual ~QgsTaskManager();
|
|
|
|
|
2016-11-25 18:15:08 +10:00
|
|
|
/**
|
|
|
|
* Definition of a task for inclusion within a task bundle.
|
|
|
|
*/
|
|
|
|
struct TaskDefinition
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Constructor for TaskDefinition. Ownership of the task is transferred to the definition.
|
|
|
|
*/
|
2016-11-29 13:07:34 +10:00
|
|
|
explicit TaskDefinition( QgsTask* task, QgsTaskList dependencies = QgsTaskList() );
|
2016-11-25 18:15:08 +10:00
|
|
|
|
|
|
|
//! Task
|
|
|
|
QgsTask* task;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* List of dependencies which must be completed before task can run.
|
|
|
|
* These tasks must be completed before task can run. If any dependent tasks are
|
|
|
|
* cancelled this task will also be cancelled. Dependent tasks must also be added
|
|
|
|
* to the task manager for proper handling of dependencies.
|
|
|
|
*/
|
|
|
|
QgsTaskList dependencies;
|
|
|
|
};
|
|
|
|
|
2016-04-15 07:35:22 +10:00
|
|
|
/** Adds a task to the manager. Ownership of the task is transferred
|
2016-04-21 11:41:00 +10:00
|
|
|
* to the manager, and the task manager will be responsible for starting
|
2016-11-29 13:30:17 +10:00
|
|
|
* the task. The priority argument can be used to control the run queue's
|
|
|
|
* order of execution.
|
2016-04-15 07:35:22 +10:00
|
|
|
* @returns unique task ID
|
|
|
|
*/
|
2016-11-29 13:30:17 +10:00
|
|
|
long addTask( QgsTask* task /Transfer/, int priority = 0 );
|
2016-11-25 18:15:08 +10:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds a task to the manager, using a full task definition (including dependancy
|
|
|
|
* handling). Ownership of the task is transferred to the manager, and the task
|
2016-11-29 13:30:17 +10:00
|
|
|
* manager will be responsible for starting the task. The priority argument can
|
|
|
|
* be used to control the run queue's order of execution.
|
2016-11-25 18:15:08 +10:00
|
|
|
* @returns unique task ID
|
|
|
|
*/
|
2016-11-29 13:30:17 +10:00
|
|
|
long addTask( const TaskDefinition& task /Transfer/, int priority = 0 );
|
|
|
|
|
2016-04-15 07:35:22 +10:00
|
|
|
|
|
|
|
/** Returns the task with matching ID.
|
|
|
|
* @param id task ID
|
|
|
|
* @returns task if found, or nullptr
|
|
|
|
*/
|
|
|
|
QgsTask* task( long id ) const;
|
|
|
|
|
|
|
|
/** Returns all tasks tracked by the manager.
|
|
|
|
*/
|
|
|
|
QList<QgsTask*> tasks() const;
|
|
|
|
|
|
|
|
//! Returns the number of tasks tracked by the manager.
|
|
|
|
int count() const;
|
|
|
|
|
|
|
|
/** Returns the unique task ID corresponding to a task managed by the class.
|
|
|
|
* @param task task to find
|
|
|
|
* @returns task ID, or -1 if task not found
|
|
|
|
*/
|
|
|
|
long taskId( QgsTask* task ) const;
|
|
|
|
|
2016-04-15 20:49:02 +10:00
|
|
|
//! Instructs all tasks tracked by the manager to terminate.
|
2016-04-19 22:24:34 +10:00
|
|
|
void cancelAll();
|
2016-04-15 20:49:02 +10:00
|
|
|
|
2016-04-21 11:41:00 +10:00
|
|
|
//! Returns true if all dependencies for the specified task are satisfied
|
|
|
|
bool dependenciesSatisified( long taskId ) const;
|
|
|
|
|
2016-04-21 21:56:31 +10:00
|
|
|
//! Returns the set of task IDs on which a task is dependent
|
|
|
|
//! @note not available in Python bindings
|
|
|
|
//QSet< long > dependencies( long taskId ) const;
|
|
|
|
|
2016-04-22 07:53:22 +10:00
|
|
|
/** Sets a list of layers on which as task is dependent. The task will automatically
|
|
|
|
* be cancelled if any of these layers are above to be removed.
|
|
|
|
* @param taskId task ID
|
|
|
|
* @param layerIds list of layer IDs
|
|
|
|
* @see dependentLayers()
|
|
|
|
*/
|
|
|
|
void setDependentLayers( long taskId, const QStringList& layerIds );
|
|
|
|
|
|
|
|
/** Returns a list of layers on which as task is dependent. The task will automatically
|
|
|
|
* be cancelled if any of these layers are above to be removed.
|
|
|
|
* @param taskId task ID
|
|
|
|
* @returns list of layer IDs
|
|
|
|
* @see setDependentLayers()
|
|
|
|
*/
|
|
|
|
QStringList dependentLayers( long taskId ) const;
|
|
|
|
|
2016-04-26 15:54:30 +10:00
|
|
|
/** Returns a list of the active (queued or running) tasks.
|
|
|
|
* @see countActiveTasks()
|
|
|
|
*/
|
|
|
|
QList< QgsTask* > activeTasks() const;
|
|
|
|
|
|
|
|
/** Returns the number of active (queued or running) tasks.
|
|
|
|
* @see activeTasks()
|
|
|
|
* @see countActiveTasksChanged()
|
|
|
|
*/
|
|
|
|
int countActiveTasks() const;
|
|
|
|
|
2016-04-15 07:35:22 +10:00
|
|
|
signals:
|
|
|
|
|
|
|
|
//! Will be emitted when a task reports a progress change
|
|
|
|
//! @param taskId ID of task
|
|
|
|
//! @param progress percent of progress, from 0.0 - 100.0
|
|
|
|
void progressChanged( long taskId, double progress );
|
|
|
|
|
2016-11-03 17:40:38 +10:00
|
|
|
//! Will be emitted when only a single task remains to complete
|
|
|
|
//! and that task has reported a progress change
|
|
|
|
//! @param progress percent of progress, from 0.0 - 100.0
|
|
|
|
void finalTaskProgressChanged( double progress );
|
|
|
|
|
2016-04-15 07:35:22 +10:00
|
|
|
//! Will be emitted when a task reports a status change
|
|
|
|
//! @param taskId ID of task
|
|
|
|
//! @param status new task status
|
|
|
|
void statusChanged( long taskId, int status );
|
|
|
|
|
|
|
|
//! Emitted when a new task has been added to the manager
|
|
|
|
//! @param taskId ID of task
|
|
|
|
void taskAdded( long taskId );
|
|
|
|
|
|
|
|
//! Emitted when a task is about to be deleted
|
|
|
|
//! @param taskId ID of task
|
|
|
|
void taskAboutToBeDeleted( long taskId );
|
|
|
|
|
2016-04-26 15:54:30 +10:00
|
|
|
//! Emitted when all tasks are complete
|
|
|
|
//! @see countActiveTasksChanged()
|
|
|
|
void allTasksFinished();
|
|
|
|
|
|
|
|
//! Emitted when the number of active tasks changes
|
|
|
|
//! @see countActiveTasks()
|
|
|
|
void countActiveTasksChanged( int count );
|
|
|
|
|
2016-04-15 07:35:22 +10:00
|
|
|
};
|