summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/thread
diff options
context:
space:
mode:
authorSven Anderson <Sven.Anderson@snom.com>2011-09-08 17:40:55 +0200
committerQt by Nokia <qt-info@nokia.com>2011-11-15 10:16:12 +0100
commit2b7d98ef8fbd6cf49326fa0bbf154e9bacbb7b49 (patch)
tree250f2752acb679a237504ea70888b0ad5efa1251 /tests/auto/corelib/thread
parent51b7d3c8b621c2de6f98f465f478ec574bb14195 (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')
-rw-r--r--tests/auto/corelib/thread/qthread/tst_qthread.cpp74
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"