2012-10-22 5 views
0

QT에는 현재 매우 오랫동안 실행중인 GUI 응용 프로그램이 있습니다. 나중에이 응용 프로그램은 전체 화면 키보드없이 내장 장치에서 테스트되고 실행됩니다.QT에서 어설 션 창을 만드는 방법

쉬운 디버깅을 위해 특정 어설트 (무시할 수있는 알려진 버그가있는 부분이 포함될 수 있음)를 무시할 수있는 사용자 지정 어설 ​​션 매크로가 있습니다. 당분간은 "어설 션 : XXXX 실패, 중단/무시". 이것은 콘솔 내에서 애플리케이션을 시작할 때 좋지만 궁극적으로 최종 장치에서 실행하면 실패합니다. 이 경우 어설 션은 주 스레드가 입력을 기다리는 것을 막을 것이고 복구를 위해 GUI가 심하게 멈추게 만들 것입니다.

지금이 상황을 해결하는 방법에 대해 생각하고 있습니다. 하나의 아이디어는 표준 주장이하는 것처럼 어설트 크래시가있는 것입니다. 하지만 많은 아이디어가 있기 때문에 Idea가 마음에 들지는 않습니다. 응용 프로그램을 테스트 할 때 항상 무시 무시한 주장을 발견했습니다. 또한 메시지를 별도의 파일에 저장해야하므로 나중에 테스트하는 동안 어떤 일이 발생했는지 확인할 수 있습니다. 나중에이 파일들을 읽을 수는 있지만, 무엇이 잘못되었는지를 찾는 더 쉬운 방법을 선호합니다.

다른 아이디어는 창을 만드는 것입니다. 그러나 모든 스레드에서 어설 션이 트리거 될 수 있으며 GUI 스레드에서 새 창만 만들 수 있습니다. 또한 메인 이벤트 루프는 어설 션에 의해 차단 될 수 있으므로 이벤트를 올바르게 처리 할 수 ​​있는지 확신 할 수 없습니다. 필자는 별도의 스레드에서 완전히 반응하는 독립 실행 형 윈도우가 필요합니다. 단 몇 개의 버튼 만 처리합니다.

어떻게 든 QT4에서 가능합니까? 현재의 thread가

int result = -1; 
if (QTrhead::currentThread() == QCoreApplication::instance()->thread()) 
{ 
    result = AssertHandler->ShowDialog(where, what, condition); 
} 
else 
{ 
    QMetaObject::invokeMethod(AssertHandler, "ShowDialog", Qt::QueuedBlockingConnection, Q_RETURN_ARG(int, result), Q_ARG(QString, where), Q_ARG(QString, what), Q_ARG(QString, condition); 
} 

if (result != 0) 
{ 
    // handle assert 
} 

AssertHandler 응용 프로그램 스레드의 경우

답변

1

당신은 QObject를 기반으로 클래스가 슬롯 함께 대화 상자를 표시하고 비 GUI 스레드의 응답을 기다리는 메인 스레드에 이벤트를 게시하거나 대화 상자를 표시 할 수 있습니다 int ShowDialog(const QString &where, const QString what, const QString &condition). 어설 션 데이터 및 어설 션/무시 버튼이있는 대화 상자가 표시되어야합니다. 사용자가 무시를 누르면 0을 반환하고 그렇지 않으면 0이 아닌 값을 반환합니다.