呼叫 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()
不在线程之外工作?也许有另一种选择?
您所显示的可能是QT错误。las,如果其他线程有任何未决事件,您可能不需要以这种方式检查。
我看到您可能要这样做的唯一原因是管理自己的线程池并将对象移至不忙碌的线程。您将保留"繁忙"one_answers"可用"线程的列表。这就是QAbstractEventDispatcher::aboutToBlock
信号的目的。您的线程池应为其创建的每个线程连接到此信号,并在接收时将线程添加到"可用"列表中。
另一方面,您正在尝试使用它来实现某些事件压缩,那确实是最尴尬的方法。在另一个答案中,我展示了如何实现自定义事件压缩,以及如何压缩信号插槽调用。