4

アプリケーションのどのイベントがメインスレッド(GUIのブロック)で実行するのに長い時間がかかるか、または少なくとも10ミリ秒以上かかるイベントがあるかどうかを測定したいと思います。私は明らかに、長い時間がかかるタスクにスレッド化と並行性を使用しますが、他のスレッドに入れるものとGUIにとどまることができるものとの間に線を引くのは難しい場合があります。特に、複数のOSと、新しいハードウェアと数年前のハードウェアの両方で実行されるアプリの場合。

QApplication(およびQCoreApplication)を見ましたが、時間測定で簡単にオーバーライドしてラップできる「processSingleEvent」のような関数はありません。AFAIUにはイベントの処理後に通知を受け取る方法がないため、イベントフィルターもこのトリックを実行しません。

QApplication :: processEventsを手動で(execを呼び出さずに)呼び出すことができると思いましたが、これも単一イベントの粒度を提供せず、読んだように、destroyイベントを処理しません。

QCoreApplication :: exec実装を調べたところ、内部でQEventLoopを使用していることがわかりました。したがって、元の実装に特別なコードを追加する場合は、QApplicationとQEventLoopの両方を再実装して、Qtソースから多くのコードをコピーする必要があります...

編集:質問は明らかに次のとおりです:おそらく単純で「クリーンな」方法でイベント処理時間を測定する方法は?

4

1 に答える 1

7

bool QCoreApplication :: notify(QObject *レシーバー、QEvent *イベント)をオーバーライドします:

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

    ...

これは、キャッチオールタイプの例外処理の場所でもあります。

于 2013-02-27T01:29:10.053 に答える