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
parent
97741a9590
commit
cd787dbac9
|
|
@ -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 ¶meters)
|
||||
{
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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"));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue