Вымойтесь прежде, чем закрыть QCoreApplication

Я не уверен, как это сделать в работающей программе, но, возможно, LD_PRELOAD будет работать для вас. Если вы установите для этой переменной среды список общих объектов, загрузчик времени выполнения загрузит общий объект в начале процесса и позволит его функциям иметь приоритет над другими.

LD_PRELOAD=path_to_library/asdf.so path/to/prog 

Вы должны сделать это, прежде чем начать процесс, но вам не нужно перестраивать программу.

5
задан Toby Speight 7 December 2016 в 14:26
поделиться

2 ответа

Очистка должна выполняться деструкторами и отношениями дочерний и родительский.

Сделайте ваш главный объект (тот, который находится в основном) дочерним по отношению к QApplication, чтобы он был уничтожен со всеми его дочерними элементами до QApplication является.

Вы уверены, что убили все свои нити? Если это поток с циклом событий, обязательно вызовите QThread :: quit () для выхода из цикла событий перед вызовом QThread :: wait ()

Вы также можете использовать void 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();
}
16
ответ дан 18 December 2019 в 07:10
поделиться

вы можете подключиться к сигналу QCoreApplication :: aboutToQuit и выполнить необходимую очистку там наверху.

1
ответ дан 18 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: