46 lines
1,011 B
C
46 lines
1,011 B
C
|
|
#ifndef RUNCONTROLLABLETASK_H
|
|||
|
|
#define RUNCONTROLLABLETASK_H
|
|||
|
|
/** From answer by Hatter
|
|||
|
|
*
|
|||
|
|
* https://stackoverflow.com/questions/5423058/qfuture-that-can-be-cancelled-and-report-progress
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#include <QFutureInterface>
|
|||
|
|
#include <QRunnable>
|
|||
|
|
#include "ControllableTask.h"
|
|||
|
|
|
|||
|
|
template <typename T>
|
|||
|
|
class RunControllableTask : public QFutureInterface<T> , public QRunnable
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
RunControllableTask(ControllableTask<T>* tsk) : task(tsk) { }
|
|||
|
|
virtial ~RunControllableTask() { delete task; }
|
|||
|
|
|
|||
|
|
QFuture<T> start()
|
|||
|
|
{
|
|||
|
|
this->setRunnable(this);
|
|||
|
|
this->reportStarted();
|
|||
|
|
QFuture<T> future = this->future();
|
|||
|
|
QThreadPool::globalInstance()->start(this, /*m_priority*/ 0);
|
|||
|
|
return future;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void run()
|
|||
|
|
{
|
|||
|
|
if (this->isCanceled()) {
|
|||
|
|
this->reportFinished();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
TaskControl control(this);
|
|||
|
|
result = this->task->run(control);
|
|||
|
|
if (!this->isCanceled()) {
|
|||
|
|
this->reportResult(result);
|
|||
|
|
}
|
|||
|
|
this->reportFinished();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
T result;
|
|||
|
|
ControllableTask<T> *task;
|
|||
|
|
};
|
|||
|
|
#endif // RUNCONTROLLABLETASK_H
|