是否有一种干净的方法来检查Qt主应用程序队列的当前大小?由于我发出了相当多的信号,我想监视在处理Ui线程上的插槽时有多大的延迟。
例如,在:
之后emit Signal();
emit Signal();
emit Signal();
我希望能够打电话给这样的话,这会告诉我有多少信号仍在处理中。
QApplication::checkQueueSize();
答案 0 :(得分:1)
为了跟进,我决定采用一种解决方案,而这将允许我通过队列来衡量延迟。正如多人指出的那样,没有真正的用例来查看队列大小。
我已经通过将时间戳映射到“发出信号”之前到调用插槽之后实现了这一点。
答案 1 :(得分:1)
使用以下代码段可以获取特定线程的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?