如何监控Qt主队列长度



是否有一种干净的方法来检查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中给定事件发出的所有信号?

相关内容

  • 没有找到相关文章

最新更新