QtConcurrent: Get rid of multi-inheritance inside RunFunctionTaskBase

Use aggregation instead. Prepare for using QPromise instead of QFutureInterface.

Task-number: QTBUG-84702
Change-Id: Ic88564dca8c83a178a281cb843032292210a6d25
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
bb10
Jarek Kobus 2020-07-10 14:12:33 +02:00
parent 97741a9590
commit cd787dbac9
2 changed files with 23 additions and 21 deletions

View File

@ -79,7 +79,7 @@ struct TaskStartParameters
};
template <typename T>
class RunFunctionTaskBase : public QFutureInterface<T> , public QRunnable
class RunFunctionTaskBase : public QRunnable
{
public:
QFuture<T> start()
@ -89,10 +89,10 @@ public:
QFuture<T> start(const TaskStartParameters &parameters)
{
this->setThreadPool(parameters.threadPool);
this->setRunnable(this);
this->reportStarted();
QFuture<T> theFuture = this->future();
promise.setThreadPool(parameters.threadPool);
promise.setRunnable(this);
promise.reportStarted();
QFuture<T> theFuture = promise.future();
parameters.threadPool->start(this, parameters.priority);
return theFuture;
}
@ -102,8 +102,8 @@ public:
void run() override
{
if (this->isCanceled()) {
this->reportFinished();
if (promise.isCanceled()) {
promise.reportFinished();
return;
}
#ifndef QT_NO_EXCEPTIONS
@ -112,20 +112,22 @@ public:
runFunctor();
#ifndef QT_NO_EXCEPTIONS
} catch (QException &e) {
QFutureInterface<T>::reportException(e);
promise.reportException(e);
} catch (...) {
QFutureInterface<T>::reportException(QUnhandledException());
promise.reportException(QUnhandledException());
}
#endif
reportResult();
this->reportFinished();
promise.reportFinished();
}
protected:
virtual void runFunctor() = 0;
virtual void reportResult() {}
QFutureInterface<T> promise;
};
template <typename T>
@ -135,9 +137,9 @@ protected:
void reportResult() override
{
if constexpr (std::is_move_constructible_v<T>)
this->reportAndMoveResult(std::move(result));
this->promise.reportAndMoveResult(std::move(result));
else if constexpr (std::is_copy_constructible_v<T>)
this->reportResult(result);
this->promise.reportResult(result);
}
T result;

View File

@ -457,9 +457,9 @@ class ProgressEmitterTask : public RunFunctionTask<void>
public:
void runFunctor()
{
setProgressRange(0, maxProgress);
promise.setProgressRange(0, maxProgress);
for (int p = 0; p <= maxProgress; ++p)
setProgressValue(p);
promise.setProgressValue(p);
}
};
@ -487,19 +487,19 @@ class ProgressTextTask : public RunFunctionTask<T>
public:
void runFunctor()
{
this->setProgressValueAndText(1, QLatin1String("Foo 1"));
this->promise.setProgressValueAndText(1, QLatin1String("Foo 1"));
while (this->isProgressUpdateNeeded() == false)
while (this->promise.isProgressUpdateNeeded() == false)
QTest::qSleep(1);
this->setProgressValueAndText(2, QLatin1String("Foo 2"));
this->promise.setProgressValueAndText(2, QLatin1String("Foo 2"));
while (this->isProgressUpdateNeeded() == false)
while (this->promise.isProgressUpdateNeeded() == false)
QTest::qSleep(1);
this->setProgressValueAndText(3, QLatin1String("Foo 3"));
this->promise.setProgressValueAndText(3, QLatin1String("Foo 3"));
while (this->isProgressUpdateNeeded() == false)
while (this->promise.isProgressUpdateNeeded() == false)
QTest::qSleep(1);
this->setProgressValueAndText(4, QLatin1String("Foo 4"));
this->promise.setProgressValueAndText(4, QLatin1String("Foo 4"));
}
};