diff options
author | Sven Anderson <Sven.Anderson@snom.com> | 2011-09-08 17:40:55 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-11-15 10:16:12 +0100 |
commit | 2b7d98ef8fbd6cf49326fa0bbf154e9bacbb7b49 (patch) | |
tree | 250f2752acb679a237504ea70888b0ad5efa1251 /tests/auto/corelib/thread/qthread/tst_qthread.cpp | |
parent | 51b7d3c8b621c2de6f98f465f478ec574bb14195 (diff) |
Allow to create a custom event dispatcher for specific QThreads.
QAbstractEventDispatcher() does no longer install itself into the current
thread. Instead the new methods QThread::setEventDispatcher() and
QCoreApplication::setEventDispatcher() allow to install a custom event
dispatcher into any QThread as long as there is no default event dispatcher
created yet. That is, before the thread has been started with
QThread::start() or, in case of the main thread, before QCoreApplication has
been instantiated.
Change-Id: I7367e13d8d8aebed5a5651260bb69b8818eb1b90
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
Diffstat (limited to 'tests/auto/corelib/thread/qthread/tst_qthread.cpp')
-rw-r--r-- | tests/auto/corelib/thread/qthread/tst_qthread.cpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/tests/auto/corelib/thread/qthread/tst_qthread.cpp b/tests/auto/corelib/thread/qthread/tst_qthread.cpp index 6d7a02b3cc..fcf993bb7b 100644 --- a/tests/auto/corelib/thread/qthread/tst_qthread.cpp +++ b/tests/auto/corelib/thread/qthread/tst_qthread.cpp @@ -107,6 +107,8 @@ private slots: void startAndQuitCustomEventLoop(); void isRunningInFinished(); + void customEventDispatcher(); + #ifndef Q_OS_WINCE void stressTest(); #endif @@ -1218,5 +1220,77 @@ void tst_QThread::isRunningInFinished() } } +class DummyEventDispatcher : public QAbstractEventDispatcher { +public: + DummyEventDispatcher() : QAbstractEventDispatcher(), visited(false) {} + bool processEvents(QEventLoop::ProcessEventsFlags) { + visited = true; + emit awake(); + QCoreApplication::sendPostedEvents(); + return false; + } + bool hasPendingEvents() { + extern uint qGlobalPostedEventsCount(); // from qapplication.cpp + return qGlobalPostedEventsCount(); + } + void registerSocketNotifier(QSocketNotifier *) {} + void unregisterSocketNotifier(QSocketNotifier *) {} + void registerTimer(int , int , QObject *) {} + bool unregisterTimer(int ) { return false; } + bool unregisterTimers(QObject *) { return false; } + QList<TimerInfo> registeredTimers(QObject *) const { return QList<TimerInfo>(); } + void wakeUp() {} + void interrupt() {} + void flush() {} + + bool visited; +}; + +class ThreadObj : public QObject +{ + Q_OBJECT +public slots: + void visit() { + emit visited(); + } +signals: + void visited(); +}; + +void tst_QThread::customEventDispatcher() +{ + QThread thr; + // there should be no ED yet + QVERIFY(!thr.eventDispatcher()); + DummyEventDispatcher *ed = new DummyEventDispatcher; + thr.setEventDispatcher(ed); + // the new ED should be set + QCOMPARE(thr.eventDispatcher(), ed); + // test the alternative API of QAbstractEventDispatcher + QCOMPARE(QAbstractEventDispatcher::instance(&thr), ed); + thr.start(); + // start() should not overwrite the ED + QCOMPARE(thr.eventDispatcher(), ed); + + ThreadObj obj; + obj.moveToThread(&thr); + // move was successful? + QCOMPARE(obj.thread(), &thr); + QEventLoop loop; + connect(&obj, SIGNAL(visited()), &loop, SLOT(quit()), Qt::QueuedConnection); + QMetaObject::invokeMethod(&obj, "visit", Qt::QueuedConnection); + loop.exec(); + // test that the ED has really been used + QVERIFY(ed->visited); + + QWeakPointer<DummyEventDispatcher> weak_ed(ed); + QVERIFY(!weak_ed.isNull()); + thr.quit(); + // wait for thread to be stopped + QVERIFY(thr.wait(30000)); + // test that ED has been deleted + QVERIFY(weak_ed.isNull()); +} + QTEST_MAIN(tst_QThread) #include "tst_qthread.moc" |