diff options
-rw-r--r-- | src/corelib/thread/qthread.cpp | 4 | ||||
-rw-r--r-- | tests/auto/qthread/tst_qthread.cpp | 35 |
2 files changed, 37 insertions, 2 deletions
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp index 53e4d5eb16..74bbd4eb04 100644 --- a/src/corelib/thread/qthread.cpp +++ b/src/corelib/thread/qthread.cpp @@ -457,7 +457,7 @@ bool QThread::isFinished() const { Q_D(const QThread); QMutexLocker locker(&d->mutex); - return d->finished; + return d->finished || d->isInFinish; } /*! @@ -475,7 +475,7 @@ bool QThread::isRunning() const if (d->data->symbian_thread_handle.Handle() && d->data->symbian_thread_handle.ExitType() != EExitPending) return false; #endif - return d->running; + return d->running && !d->isInFinish; } /*! diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp index c56d302546..ee9ac309af 100644 --- a/tests/auto/qthread/tst_qthread.cpp +++ b/tests/auto/qthread/tst_qthread.cpp @@ -117,6 +117,7 @@ private slots: void destroyFinishRace(); void startFinishRace(); void startAndQuitCustomEventLoop(); + void isRunningInFinished(); void stressTest(); #ifdef Q_OS_SYMBIAN @@ -1418,5 +1419,39 @@ void tst_QThread::threadNameTest() } #endif // Q_OS_SYMBIAN +class FinishedTestObject : public QObject { + Q_OBJECT +public: + FinishedTestObject() : ok(false) {} + bool ok; +public slots: + void slotFinished() { + QThread *t = qobject_cast<QThread *>(sender()); + ok = t && t->isFinished() && !t->isRunning(); + } +}; + +void tst_QThread::isRunningInFinished() +{ + for (int i = 0; i < 15; i++) { + QThread thread; + thread.start(); + FinishedTestObject localObject; + FinishedTestObject inThreadObject; + localObject.setObjectName("..."); + inThreadObject.moveToThread(&thread); + connect(&thread, SIGNAL(finished()), &localObject, SLOT(slotFinished())); + connect(&thread, SIGNAL(finished()), &inThreadObject, SLOT(slotFinished())); + QEventLoop loop; + connect(&thread, SIGNAL(finished()), &loop, SLOT(quit())); + QMetaObject::invokeMethod(&thread, "quit", Qt::QueuedConnection); + loop.exec(); + QVERIFY(!thread.isRunning()); + QVERIFY(thread.isFinished()); + QVERIFY(localObject.ok); + QVERIFY(inThreadObject.ok); + } +} + QTEST_MAIN(tst_QThread) #include "tst_qthread.moc" |