Вызов QCoreApplication::hasPendingEvents() или QAbstractEventDispatcher::instance()->hasPendingEvents() внутри потока работает нормально. Однако вне его последний (с соответствующим параметром) всегда возвращает false (первый нельзя использовать снаружи, потому что он относится к потоку, из которого он вызывается).
Вот полный код:
#include <QCoreApplication>
#include <QAbstractEventDispatcher>
#include <QThread>
#include <QDebug>
bool hasPendingEvents(QThread *thread = 0) {
return QAbstractEventDispatcher::instance(thread)->hasPendingEvents();
}
class MyObject: public QObject {
Q_OBJECT
public slots:
void Run() {
qDebug() << __LINE__ << hasPendingEvents() << QCoreApplication::hasPendingEvents();
QThread::sleep(1);
}
};
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
QThread thread;
MyObject t;
t.moveToThread(&thread);
thread.start();
for (int i = 0; i<4; ++i) QMetaObject::invokeMethod(&t, "Run", Qt::QueuedConnection);
for (int i = 0; i<10; ++i) {
QThread::msleep(500);
qDebug() << __LINE__ << hasPendingEvents(&thread) << hasPendingEvents(t.thread());
}
return 0;
}
#include "main.moc"
Вот результат:
15 true true
31 false false
31 false false
15 true true
31 false false
31 false false
15 true true
31 false false
31 false false
15 false false
31 false false
31 false false
31 false false
31 false false
Почему QAbstractEventDispatcher.hasPendingEvents() не работает вне потока? Может есть альтернатива?
&thread == t.thread(), поэтому нет смысла проверять одно и то же дважды. - person Kuba hasn't forgotten Monica   schedule 31.01.2014