diff options
-rw-r--r-- | src/corelib/thread/qthread.cpp | 4 | ||||
-rw-r--r-- | tests/auto/corelib/thread/qthread/tst_qthread.cpp | 34 |
2 files changed, 36 insertions, 2 deletions
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp index 7a2e4b8f28..6cc8a4875a 100644 --- a/src/corelib/thread/qthread.cpp +++ b/src/corelib/thread/qthread.cpp @@ -422,7 +422,7 @@ bool QThread::isFinished() const { Q_D(const QThread); QMutexLocker locker(&d->mutex); - return d->finished; + return d->finished || d->isInFinish; } /*! @@ -434,7 +434,7 @@ bool QThread::isRunning() const { Q_D(const QThread); QMutexLocker locker(&d->mutex); - return d->running; + return d->running && !d->isInFinish; } /*! diff --git a/tests/auto/corelib/thread/qthread/tst_qthread.cpp b/tests/auto/corelib/thread/qthread/tst_qthread.cpp index f832995e75..bf9faf181a 100644 --- a/tests/auto/corelib/thread/qthread/tst_qthread.cpp +++ b/tests/auto/corelib/thread/qthread/tst_qthread.cpp @@ -111,6 +111,7 @@ private slots: void destroyFinishRace(); void startFinishRace(); void startAndQuitCustomEventLoop(); + void isRunningInFinished(); #ifndef Q_OS_WINCE void stressTest(); @@ -1199,6 +1200,39 @@ void tst_QThread::startAndQuitCustomEventLoop() } } +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" |