From 9efe2a8603cd9023bfebb96a3a7ca4a65002669d Mon Sep 17 00:00:00 2001 From: Sona Kurazyan Date: Mon, 24 Aug 2020 16:57:18 +0200 Subject: Fix QFuture::waitForFinished to wait until QFuture is started MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently QFuture::waitForFinished() exits as soon as the future is not in the running state. If the user calls it before QPromise::reportStarted() is called, it will exit immediately, because nothing is running yet. Fix the behavior to wait for the finished state. [ChangeLog][Important Behavior Changes][QtCore] Fixed the behavior of QFuture::waitForFinished() to wait until the future is actually in the finished state, instead of exiting as soon as it is not in the running state. This prevents waitForFinished() from exiting immediately, if at the moment of calling it the future is not started yet. Task-number: QTBUG-84867 Change-Id: I12f5e95d8200cfffa5653b6aa566a625f8320ca8 Reviewed-by: MÃ¥rten Nordheim --- tests/auto/corelib/thread/qfuture/tst_qfuture.cpp | 25 ++++++++++++++++++++++ .../corelib/thread/qpromise/snippet_qpromise.cpp | 5 +---- 2 files changed, 26 insertions(+), 4 deletions(-) (limited to 'tests/auto/corelib/thread') diff --git a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp index c1b562e7f4..e6f6827f3f 100644 --- a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp +++ b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp @@ -144,6 +144,7 @@ private slots: void takeResultWorksForTypesWithoutDefaultCtor(); void canceledFutureIsNotValid(); void signalConnect(); + void waitForFinished(); private: using size_type = std::vector::size_type; @@ -3076,5 +3077,29 @@ void tst_QFuture::signalConnect() } } +void tst_QFuture::waitForFinished() +{ + QFutureInterface fi; + auto future = fi.future(); + + QScopedPointer waitingThread (QThread::create([&] { + future.waitForFinished(); + })); + + waitingThread->start(); + + QVERIFY(!waitingThread->wait(200)); + QVERIFY(!waitingThread->isFinished()); + + fi.reportStarted(); + QVERIFY(!waitingThread->wait(200)); + QVERIFY(!waitingThread->isFinished()); + + fi.reportFinished(); + + QVERIFY(waitingThread->wait()); + QVERIFY(waitingThread->isFinished()); +} + QTEST_MAIN(tst_QFuture) #include "tst_qfuture.moc" diff --git a/tests/auto/corelib/thread/qpromise/snippet_qpromise.cpp b/tests/auto/corelib/thread/qpromise/snippet_qpromise.cpp index 2975afca0f..7180baccca 100644 --- a/tests/auto/corelib/thread/qpromise/snippet_qpromise.cpp +++ b/tests/auto/corelib/thread/qpromise/snippet_qpromise.cpp @@ -75,11 +75,8 @@ void snippet_QPromise::basicExample() QPromise promise; QFuture future = promise.future(); - // Note: calling reportStarted() prior to thread creation to enforce order - // of calls: first promise.reportStarted() then future.waitForFinished() - promise.reportStarted(); // notifies QFuture that the computation is started - QScopedPointer thread(QThread::create([] (QPromise promise) { + promise.reportStarted(); // notifies QFuture that the computation is started promise.addResult(42); promise.reportFinished(); // notifies QFuture that the computation is finished }, std::move(promise))); -- cgit v1.2.3