gpt4 book ai didi

qt - 在关闭 QCoreApplication 之前清理

转载 作者:行者123 更新时间:2023-12-04 16:23:57 24 4
gpt4 key购买 nike

我有一个基于控制台的 QCoreApplication它具有计时器并进行套接字通信并使用锁定的互斥锁。

当我手动关闭应用程序时,它给出错误,说某些互斥锁被锁定并且超时。当用户关闭控制台应用程序时,有什么方法可以在控制台应用程序中进行清理吗?

最佳答案

清理应该由析构函数和子父关系处理。

使您的主对象(主对象)成为 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();
}

关于qt - 在关闭 QCoreApplication 之前清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/975655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com