当前位置:   article > 正文

解决QT的无界面程序,Ctrl+C无法触发析构函数的问题_qt 控制台应用程序关闭进不去析构函数

qt 控制台应用程序关闭进不去析构函数

背景:

        我也是偶然发现,使用Ctrl+C去关闭程序的话,无法触发析构函数。判断依据是:手动写一个类,然后在主函数中创建它,不管是使用变量还是指针创建,只要是Ctrl+C,都无法触发析构函数里面的打印信息。

原因:

        经过不断测试,甚至测试了在程序中检测Ctrl+C的按键,依然无法很好的触发析构函数,最终发现,其实是因为Ctrl+c,并没有触发QCoreApplication::exit(),于是最终找到一种方式:使用MyApplication继承自QCoreApplication,在这个类中,关联信号signal(SIGINT,handlsSignal),这个handlsSignal是自己写的一个函数,用来触发QCoreApplication::exit(); 最终测试,该方案可行。

框架源码:

myApplication.h

  1. #ifndef MYAPPLICATION_H
  2. #define MYAPPLICATION_H
  3. #include <QObject>
  4. #include <csignal>
  5. #include <QCoreApplication>
  6. class MyApplication : public QCoreApplication
  7. {
  8. public:
  9. MyApplication(int argc, char **argv);
  10. ~MyApplication();
  11. static void handlsSignal(int signal);
  12. };
  13. #endif // MYAPPLICATION_H

myApplication.cpp

  1. #include "myApplication.h"
  2. MyApplication::MyApplication(int argc, char **argv):QCoreApplication(argc, argv)
  3. {
  4. signal(SIGINT,handlsSignal);
  5. }
  6. MyApplication::~MyApplication()
  7. {
  8. }
  9. void MyApplication::handlsSignal(int signal)
  10. {
  11. if(signal==SIGINT){
  12. QCoreApplication::exit();
  13. }
  14. }

使用:

        使用的时候,需要注意,需要将MyApplication作为一个资源的入口和出口,需要进行资源管理的类,都需要在这里面创建和释放,不过创建普通类对象和指针的new,申请和释放资源的顺序是不一样的。以下以指针为例:

头文件:

        增加自己的一个管理类:

  1. #ifndef MYAPPLICATION_H
  2. #define MYAPPLICATION_H
  3. #include <QObject>
  4. #include <csignal>
  5. #include <QCoreApplication>
  6. // 引入头文件
  7. #include "MainCtlModule/messageCenter.h"
  8. class MyApplication : public QCoreApplication
  9. {
  10. public:
  11. MyApplication(int argc, char **argv);
  12. ~MyApplication();
  13. static void handlsSignal(int signal);
  14. // 指针
  15. MessageCenter *msgCenter;
  16. };
  17. #endif // MYAPPLICATION_H

cpp文件:

  1. #include "myApplication.h"
  2. MyApplication::MyApplication(int argc, char **argv):QCoreApplication(argc, argv)
  3. {
  4. signal(SIGINT,handlsSignal);
  5. // 申请内存,创建指针对象
  6. msgCenter = new MessageCenter;
  7. }
  8. MyApplication::~MyApplication()
  9. {
  10. // 释放资源
  11. delete msgCenter;
  12. }
  13. void MyApplication::handlsSignal(int signal)
  14. {
  15. if(signal==SIGINT){
  16. QCoreApplication::exit();
  17. }
  18. }

完成,大家可自行测试,Ctrl + C的时候,就可以正常的执行析构函数了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/700188
推荐阅读
相关标签
  

闽ICP备14008679号