5

有没有一种干净的方法来检查 Qt 的主应用程序队列的当前大小?由于我发出了相当多的信号,我想监控在处理 Ui 线程上的插槽时有多大的延迟。

例如,之后:

emit Signal();
emit Signal();
emit Signal();

我希望能够调用这样的东西,它会告诉我还有多少信号需要处理。

QApplication::checkQueueSize();
4

3 回答 3

2

只是为了跟进,我决定采用一种解决方案,它可以让我通过队列测量延迟。正如多人指出的那样,查看队列大小没有真正的用例。

我通过将时间戳从“发出信号”之前映射到插槽被调用之后来实现这一点。

于 2013-06-18T21:51:23.480 回答
2

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 是非递归的。

于 2017-07-14T08:51:54.200 回答
0

您可能已经知道有来自 QAbstractEventDispatcher 的 QApplication::hasPendingEvents()。

这是针对 Qt4 的,但在快速查看 Qt5 源代码后,它看起来仍然不可用:

如何拦截QT中给定事件发出的所有信号?

于 2013-06-17T18:54:10.920 回答