Qt:测量事件处理时间

4
我想要测量我的应用程序中哪些事件在主线程(阻止GUI)中执行需要很长时间,或者至少是否有任何事件需要超过10毫秒。我显然使用线程和并发处理需要很长时间的任务,但有时很难区分哪些任务应该放在其他线程中,哪些任务可以留在GUI中。特别是在运行于多个操作系统和新旧硬件上的应用程序中。
我查看了QApplication(和QCoreApplication),但它没有任何“processSingleEvent”类似的功能,我可以轻松地覆盖并包装时间测量。事件过滤器也无法解决问题,因为据我所知,在事件被处理后,没有办法得到通知。
我认为我可以手动调用QApplication :: processEvents(而不必调用exec),但它仍然不能提供单个事件粒度,并且根据我所读的,它不能处理销毁事件。
我查看了QCoreApplication :: exec实现,并看到它在内部使用QEventLoop,因此如果我想将我的特殊代码添加到原始实现中,我必须重新实现QApplication和QEventLoop,并从Qt源代码中复制大量代码...
编辑:问题显然是:如何以可能简单而“干净”的方式测量事件处理时间?

你有问题吗? - sashoalm
1个回答

7

重载 bool QCoreApplication::notify ( QObject * receiver, QEvent * event )

class MyApplication : public QApplication
{
    QElapsedTimer t;
public:
    MyApplication(int& argc, char ** argv) : QApplication(argc, argv) { }
    virtual ~MyApplication() { }

    virtual bool notify(QObject* receiver, QEvent* event)
    {
        t.start();
        bool ret = QApplication::notify(receiver, event);
        if(t.elapsed() > 10)
            qDebug("processing event type %d for object %s took %dms",
                (int)event->type(), receiver->objectName().toLocal8Bit().data(),
                (int)t.elapsed());
        return ret;
    }
};

int main(int argc, char *argv[])
{
    MyApplication a(argc, argv);

    ...

这也恰好是处理“捕获所有”类型异常的地方,catch all type exception handling


太准确了!我不知道怎么会错过那个函数,我以为它是用来发送通知的。顺便说一下,当我们收到*QEvent::DeferredDelete (52)时,接收器可能已经被释放了一半,所以我们不应该在这个事件中调用receiver->objectName()*。我想你可能想纠正一下这个问题。谢谢! - moorray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接