문제

콘솔 기반이 있습니다 QCoreApplication 타이머와 소켓 통신이 있으며 잠긴 뮤텍스를 사용합니다.

응용 프로그램을 수동으로 닫으면 일부 뮤텍스가 잠겨 있고 시간이 초과된다는 오류가 발생합니다. 사용자가 닫을 때 콘솔 응용 프로그램에서 정리할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

청소는 소멸자와 아동 부모 관계에 의해 처리되어야합니다.

Qapplication이되기 전에 모든 어린이들과 함께 파괴되도록 Qapplication의 자녀로 마스터 객체 (메인에있는 것)를 만들어보십시오.

모든 스레드를 죽였다고 확신합니까? EventLoop이있는 스레드 인 경우 전화하십시오. QThread::quit() 전화하기 전에 이벤트 루프를 종료하려면 QThread::wait()

공극을 사용할 수도 있습니다 QApplication::qAddPostRoutine ( QtCleanUpFunction ptr )특별한 청소를합니다.

해당 메시지를 디버깅 할 수 있습니다 QtMsgHandler qInstallMsgHandler ( QtMsgHandler h ) 그리고 그 경고를 캡처하기 위해 자신의 메시지 처리기를 작성하십시오. 문제를 시뮬레이션 할 수 있다면 메시지에서 중단 점을 설정하고 메시지가 나오는 스택에서 볼 수 있습니다.

void debugMessageHandler( QtMsgType type, const char *msg ){
    if(QString(msg).contains( "The message you can see in the console" )){
        int breakPointOnThisLine(0);    
    }

    switch ( type ) {
        case QtDebugMsg:
            fprintf( stderr, "Debug: %s\n", msg );
            break;
        case QtWarningMsg:
            fprintf( stderr, "Warning: %s\n", msg );
            break;
        case QtFatalMsg:
            fprintf( stderr, "Fatal: %s\n", msg );
            abort();
    }
}

소멸자 및 아동 부모 관계 선으로 청소하기 위해 콘솔 닫기 신호를 잡고 전화 할 수 있습니다. QCoreApplication::exit() 응용 프로그램 인스턴스에.

#include <csignal>
#include <QtCore/QCoreApplication>
using namespace std;

struct CleanExit{
    CleanExit() {
        signal(SIGINT, &CleanExit::exitQt);
        signal(SIGTERM, &CleanExit::exitQt);
        signal(SIGBREAK, &CleanExit::exitQt) ;
    }

    static void exitQt(int sig) {
        QCoreApplication::exit(0);
    }
};


int main(int argc, char *argv[])
{
    CleanExit cleanExit;
    QCoreApplication a(argc, argv);
    return a.exec();
}

다른 팁

'Close'(Title Bar의 Red X Button)를 누르면 Closing Command Line 응용 프로그램 (Win7 & VS2010에서 확인)이 STATUS_CONTROL_C_EXIT 응용 프로그램에 신호를 보냅니다. 이 코드로 모든 스레드가 중단됩니다.

스레드 '메인 스레드'(0x980)는 코드 -1073741510 (0xc000013a)으로 종료되었습니다.

스레드 'Qthread'(0x2388)는 코드 -1073741510 (0xc000013a)으로 종료되었습니다.

그것은 이것을 QCoreApplication::aboutToQuit() 신호.

보세요 winnt.h 또는 ntstatus.h. 이것이 매니페스트 상수에 할당 된 값입니다 STATUS_CONTROL_C_EXIT. 런타임은 사용자의 취소 작업을 기록하기 위해 코드로 프로그램을 종료하도록 선택합니다.

연결할 수 있습니다 QcoreApplication :: AbouttoQuit 신호를 보내고 필요한 것을 청소하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top