是否有一种干净的方法来检查Qt的主应用程序队列的当前大小?由于我发出了相当多的信号,我想监视在Ui线程上处理插槽时有多大的延迟。
例如:
emit Signal();
emit Signal();
emit Signal();
我希望能够调用这样的东西,它会告诉我还有多少信号需要处理。
QApplication::checkQueueSize();
接下来,我决定采用一种解决方案,允许我通过队列测量延迟。正如许多人指出的那样,查看队列大小并没有真正的用例。
我通过映射时间戳从"emit Signal"之前到插槽被调用之后实现了这一点。
在我看来,获取QThread事件队列大小的信息应该是可能的(如果仅用于日志/跟踪目的)。
可以使用下面的代码片段获取特定线程的postEventList的大小:
#include <QThread>
#include <private/qthread_p.h>
int getEventQueueSize(QThread* thread)
{
auto threadData = QThreadData::get2(thread);
QMutexLocker locker(&threadData->postEventList.mutex);
return threadData->postEventList.size();
}
您需要特别注意使用的包含路径,因为需要提供private/qthread_p.h和private/qobject_p.h的路径。因此,除了通常的include之外,您还需要添加:
g++ ... -isystem /usr/include/qt5/QtCore/5.7.1/QtCore ...
免责声明:使用风险自负。由于这触及了Qt的内部,并且可能是无意的使用,所以在使用它时要格外小心。可能有一个死锁的机会,当postEventList。互斥锁被锁定(如上面的例子)。还要注意的是,QVector不是线程安全的(postEventList是一个QVector)和postEventList。
你可能已经知道QApplication::hasPendingEvents()来自QAbstractEventDispatcher
这是Qt4,但在快速查看Qt5源代码后,它看起来仍然不可用:
如何拦截QT中给定事件发出的所有信号?