diff options
Diffstat (limited to 'tests/auto/corelib/thread/qthread/tst_qthread.cpp')
-rw-r--r-- | tests/auto/corelib/thread/qthread/tst_qthread.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/tests/auto/corelib/thread/qthread/tst_qthread.cpp b/tests/auto/corelib/thread/qthread/tst_qthread.cpp index 1ee628dde5..5cc0e5bdb4 100644 --- a/tests/auto/corelib/thread/qthread/tst_qthread.cpp +++ b/tests/auto/corelib/thread/qthread/tst_qthread.cpp @@ -106,6 +106,8 @@ private slots: void customEventDispatcher(); + void requestTermination(); + #ifndef Q_OS_WINCE void stressTest(); #endif @@ -1345,5 +1347,43 @@ void tst_QThread::quitLock() QVERIFY(exitThreadCalled); } +class StopableJob : public QObject +{ + Q_OBJECT +public: + StopableJob (QSemaphore &sem) : sem(sem) {} + QSemaphore &sem; +public Q_SLOTS: + void run() { + sem.release(); + while (!thread()->isInterruptionRequested()) + QTest::qSleep(10); + sem.release(); + Q_EMIT finished(); + } +Q_SIGNALS: + void finished(); +}; + +void tst_QThread::requestTermination() +{ + QThread thread; + QVERIFY(!thread.isInterruptionRequested()); + QSemaphore sem; + StopableJob *j = new StopableJob(sem); + j->moveToThread(&thread); + connect(&thread, &QThread::started, j, &StopableJob::run); + connect(j, &StopableJob::finished, &thread, &QThread::quit, Qt::DirectConnection); + connect(&thread, &QThread::finished, j, &QObject::deleteLater); + thread.start(); + QVERIFY(!thread.isInterruptionRequested()); + sem.acquire(); + QVERIFY(!thread.wait(1000)); + thread.requestInterruption(); + sem.acquire(); + QVERIFY(thread.wait(1000)); + QVERIFY(!thread.isInterruptionRequested()); +} + QTEST_MAIN(tst_QThread) #include "tst_qthread.moc" |