2013-02-26 3 views
1

내 응용 프로그램의 어떤 이벤트가 메인 스레드 (GUI 차단)에서 실행되는 데 오랜 시간이 걸리는지, 아니면 적어도 10msec 이상 걸리는 이벤트가 있는지 측정하고 싶습니다. 분명히 오랜 시간이 걸리는 작업에는 스레딩과 동시성을 사용하지만, 다른 스레드에 넣을 내용과 GUI를 유지할 수있는 부분 사이에 선을 그려야하는 경우가 있습니다. 특히 여러 OS 및 새 하드웨어와 몇 년 전의 하드웨어에서 실행되는 앱이 있습니다.Qt : 이벤트 처리 시간 측정

QApplication (및 QCoreApplication)을 보았지만 클라우드가 쉽게 오버라이드하고 시간 측정으로 랩핑하는 "processSingleEvent"종류의 기능을 가지고 있지 않습니다. AFAIU는 이벤트가 처리 된 후 알림을받을 수있는 방법이 없으므로 이벤트 필터는 또한 트릭을 수행하지 않습니다.

QApplication :: processEvents를 수동으로 (exec를 호출하지 않고도) 호출 할 수 있다고 생각했지만, 다시 한번 단일 이벤트 세분성을 제공하지는 않으며 읽었을 때 파괴 이벤트를 처리하지 못했습니다.

QCoreApplication :: exec 구현을 살펴본 후 QEventLoop을 내부적으로 사용한다는 것을 알았습니다. 따라서 특수 구현 코드를 추가하려면 QApplication과 QEventLoop을 모두 다시 구현해야합니다. Qt 소스에서 많은 코드를 복사합니다. ...

: 질문은 분명히 : 간단하고 "깨끗한"방법으로 이벤트 처리 시간을 측정하는 방법은 무엇입니까?

+0

질문이 있으십니까? – sashoalm

답변

5

재정 bool QCoreApplication::notify (QObject * receiver, QEvent * event) : 또한 catch all type exception handling의 장소로 발생

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

    ... 

.

+0

Spot on! 어떻게 그 기능을 놓칠 수 있는지 모르겠다. ** ** 알림을 보내는데 익숙하다고 생각했다. BTW 우리는 * QEvent :: DeferredDelete (52) *를 얻었을 때 수신기가 이미 절반이 해제 된 것처럼 보일 수 있으므로이 이벤트와 함께 * receiver-> objectName() *을 호출하면 안됩니다. 네가 그걸 정정하길 원한다고 생각 했어. 감사! – moorray