有没有一种干净的方法来检查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是非递归的。

09-11 17:33