如何监控Qt主队列长度?

时间:2013-06-17 15:46:33

标签: c++ qt qt5

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

例如,在:

之后
emit Signal();
emit Signal();
emit Signal();

我希望能够打电话给这样的话,这会告诉我有多少信号仍在处理中。

QApplication::checkQueueSize();

3 个答案:

答案 0 :(得分:1)

为了跟进,我决定采用一种解决方案,而这将允许我通过队列来衡量延迟。正如多人指出的那样,没有真正的用例来查看队列大小。

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

答案 1 :(得分:1)

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();
}

你需要特别小心w.r.t.使用的包含路径,因为需要提供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是非递归的。

答案 2 :(得分:0)

您可能已经知道QAbstractEventDispatcher中存在QApplication :: hasPendingEvents()。

这适用于Qt4,但在快速浏览一下Qt5源代码之后,它看起来仍然无法使用:

How to intercept ALL signals emitted by a given event in QT?