有没有一种干净的方法来检查 Qt 的主应用程序队列的当前大小?由于我发出了相当多的信号,我想监控在处理 Ui 线程上的插槽时有多大的延迟。
例如,之后:
emit Signal();
emit Signal();
emit Signal();
我希望能够调用这样的东西,它会告诉我还有多少信号需要处理。
QApplication::checkQueueSize();
只是为了跟进,我决定采用一种解决方案,它可以让我通过队列测量延迟。正如多人指出的那样,查看队列大小没有真正的用例。
我通过将时间戳从“发出信号”之前映射到插槽被调用之后来实现这一点。
Imo,应该有可能(如果仅用于记录/跟踪目的)获取有关 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 的路径。因此,除了通常的包含之外,您还需要添加:
g++ ... -isystem /usr/include/qt5/QtCore/5.7.1/QtCore ...
免责声明:使用风险自负。由于这涉及到 Qt 的内部,并且可能是无意使用的,因此在使用时要格外小心。当 postEventList.mutex 被锁定时(如上例所示),可能会出现死锁。另请注意,QVector 不是线程安全的(postEventList 是 QVector)并且 postEventList.mutex 是非递归的。
您可能已经知道有来自 QAbstractEventDispatcher 的 QApplication::hasPendingEvents()。
这是针对 Qt4 的,但在快速查看 Qt5 源代码后,它看起来仍然不可用: