赞
踩
我也是偶然发现,使用Ctrl+C去关闭程序的话,无法触发析构函数。判断依据是:手动写一个类,然后在主函数中创建它,不管是使用变量还是指针创建,只要是Ctrl+C,都无法触发析构函数里面的打印信息。
经过不断测试,甚至测试了在程序中检测Ctrl+C的按键,依然无法很好的触发析构函数,最终发现,其实是因为Ctrl+c,并没有触发QCoreApplication::exit(),于是最终找到一种方式:使用MyApplication继承自QCoreApplication,在这个类中,关联信号signal(SIGINT,handlsSignal),这个handlsSignal是自己写的一个函数,用来触发QCoreApplication::exit(); 最终测试,该方案可行。
myApplication.h
- #ifndef MYAPPLICATION_H
- #define MYAPPLICATION_H
-
- #include <QObject>
- #include <csignal>
- #include <QCoreApplication>
-
-
- class MyApplication : public QCoreApplication
- {
- public:
- MyApplication(int argc, char **argv);
- ~MyApplication();
-
- static void handlsSignal(int signal);
- };
-
- #endif // MYAPPLICATION_H
myApplication.cpp
- #include "myApplication.h"
-
- MyApplication::MyApplication(int argc, char **argv):QCoreApplication(argc, argv)
- {
- signal(SIGINT,handlsSignal);
- }
-
- MyApplication::~MyApplication()
- {
-
- }
-
- void MyApplication::handlsSignal(int signal)
- {
- if(signal==SIGINT){
- QCoreApplication::exit();
- }
-
- }
使用的时候,需要注意,需要将MyApplication作为一个资源的入口和出口,需要进行资源管理的类,都需要在这里面创建和释放,不过创建普通类对象和指针的new,申请和释放资源的顺序是不一样的。以下以指针为例:
增加自己的一个管理类:
- #ifndef MYAPPLICATION_H
- #define MYAPPLICATION_H
-
- #include <QObject>
- #include <csignal>
- #include <QCoreApplication>
-
- // 引入头文件
- #include "MainCtlModule/messageCenter.h"
-
- class MyApplication : public QCoreApplication
- {
- public:
- MyApplication(int argc, char **argv);
- ~MyApplication();
- static void handlsSignal(int signal);
-
- // 指针
- MessageCenter *msgCenter;
-
- };
-
- #endif // MYAPPLICATION_H
- #include "myApplication.h"
-
- MyApplication::MyApplication(int argc, char **argv):QCoreApplication(argc, argv)
- {
- signal(SIGINT,handlsSignal);
-
- // 申请内存,创建指针对象
- msgCenter = new MessageCenter;
- }
-
- MyApplication::~MyApplication()
- {
- // 释放资源
- delete msgCenter;
- }
-
- void MyApplication::handlsSignal(int signal)
- {
- if(signal==SIGINT){
- QCoreApplication::exit();
- }
-
- }
完成,大家可自行测试,Ctrl + C的时候,就可以正常的执行析构函数了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。