Question

I ai un QCoreApplication basée sur la console qui a temporisateurs et fait la communication par socket et utilise également mutex verrouillé.

Quand je ferme l'application, il donne manuellement erreur indiquant que certains mutex est verrouillé et il est expiré. Est-il possible que je peux faire nettoyer dans une application de la console lorsque l'utilisateur le ferme?

Était-ce utile?

La solution

Le nettoyage doit être manipulé par et relation Destructeurs parent-enfant.

Faites votre objet principal (celui du principal) un enfant de QApplication il est détruit avec tous ses Childs avant QApplication est.

Êtes-vous sûr de tous vos fils tué? Si elle est un fil avec un eventloop assurez-vous d'appeler QThread::quit() pour quitter le eventloop avant d'appeler QThread::wait()

Vous pouvez également utiliser la QApplication::qAddPostRoutine ( QtCleanUpFunction ptr ) vide de procéder à un nettoyage spécial.

Pour le débogage de ces messages que vous pouvez utiliser QtMsgHandler qInstallMsgHandler ( QtMsgHandler h ) et écrire votre propre gestionnaire de messages pour capturer ces avertissements. Si vous pouvez simuler le problème que vous pouvez définir un point d'arrêt sur le message et voir sur la pile où le message vient.

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

Pour nettoyer avec destructor et navire relation parent-enfant, vous pouvez attraper la console signal de fermeture et d'appeler QCoreApplication::exit() à l'instance d'application.

#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();
}

Autres conseils

apparaît que la fermeture de l'application de la ligne de commande (vérifié sur Win7 & VS2010) en appuyant sur « proche » (bouton rouge de x sur la barre de titre) transmet le signal de STATUS_CONTROL_C_EXIT à l'application. Tous les sujets sont avortés avec ce code.

  

Le fil 'du fil principal' (0x980) est sorti avec le code -1073741510   (0xc000013a).

     

Le fil 'QThread' (0x2388) est sorti avec le code   -1073741510 (0xc000013a).

Cela signifie qu'il n'y a pas moyen d'intercepter ce signal avec le QCoreApplication::aboutToQuit().

Jetez un oeil à winnt.h ou ntstatus.h. Telle est la valeur attribuée à la manifester STATUS_CONTROL_C_EXIT constant. Le temps d'exécution est juste le choix de mettre fin à votre programme avec le code de noter cancel de l'utilisateur opération.

vous pouvez vous connecter à QCoreApplication :: aboutToQuit le signal et faire le nécessaire nettoyer là-bas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top