许多人创建qt控制台程序会遇到这种情况,关闭控制台的时候,自己写的子线程无法正常退出,无法进入自己创建的对象的析构函数,总之程序非正常退出.
为解决这种问题我想了几种思路,实践证明最后一种思路可以达到要求,没有耐心的可以直接看最后一项解决方案:
1.通过QTextStream监听用户输入, 当用户有输入则退出程序.

 QCoreApplication aMyClass c;QString str;QTextStream in(stdin);//获取数据in>>str;QTimer::singleShot(0, &a, SLOT(quit()));return a.exec();

这样确实可以进入MyClass析构函数,但是,注意了:QTextStream in(stdin);//获取数据, 这是阻塞的,意味着你不输入主线程就阻塞在此处, 你主线程中其他逻辑无法执行,比如socket帧听获取网络数据就无法获取到.
2.定义的MyClass类继承QCoreApplication,重写event事件函数,获取到quit事件时执行析构,退出子线程等操作.
经过测试实际也没达到效果,此处不再细说.
3.废话不说,来正确的处理方法. 启动子线程监听用户输入,比如输入q时退出程序,实测完全达到效果.

int main()
{......
......MyInputThread *thread = new MyInputThread;QObject::connect(thread, SIGNAL(finished()), &a, SLOT(quit()),Qt::DirectConnection);//连接信号thread->start();return a.exec();
}
void MyInputThread::run()
{QString strTip("Press 'q' will exit.");while (true){printf("%s", strTip.toStdString().c_str());if (getchar() == 'q'){break;}}printf("app exit.");
}

注意其中在信号连接处有个小知识就是要加上Qt::DirectConnection选项,否则无法触发quit槽函数.应为默认的connect选项是:Qt::AutoConnection,注意我们finish信号和quit槽并非处于同一个线程,如果使用autoconnection连接,其实是QueuedConnection, 也就是要等接收线程退出时间循环才会调用槽, 也就是等a.exec()退出. 使用DirectConnection会立即调用槽函数,在发送信号的线程中执行槽函数.

qt控制台程序无法正常退出并回收资源相关推荐

  1. Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法

    Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法 最近由于老师要求要在Ubuntu下QT上进程多线程服务器的开发,虽然只是单纯的调用qt的network模块,但是为了避免麻烦,我 ...

  2. Qt 控制台程序正常退出

    废话不多说,最近想写一个控制台程序,希望在执行完正常的代码后自动退出程序,研究了很久很久,看了很多办法,都不得行,最后可行的办法记录于此,避免以后再次入坑. 首先,Qt 程序正常退出的方式有如下几种: ...

  3. Qt 控制台程序:和原生C++的融入

    网上看到几个案例还不错,可惜是用原生c++写的,QT工程不好使,这时候可以考虑用console程序,就是最原始的那种形式. 首先pro工程里,将gui替换成console: #------------ ...

  4. Qt应用程序图标设置任务栏图标设置

    一.Qt应用程序图标设置 1.添加资源文件: 在vs资源视图中选中项目右键->添加->资源,选择icon或者version,vs会创建一个名叫"项目名称.rc"的资源文 ...

  5. 关于解决Win32控制台程序编译后自动退出

    问题描述:Win32控制台程序编译运行后自动退出,看不到结果,解决此问题有如下几种方法: 使用CTRL+F5进行编译: 使用getchar()函数,放在程序的最后: 使用system("pa ...

  6. 使用C++控制台程序或Python调用Dll创建Qt界面(dll中创建QApplication,qtwinmigrate的使用)

    目录 理论 构建DLL 使用Python进行调用 使用C++控制台程序进行调用 理论 在Windows下,可能要用MFC或C#或Java,python调用一个插件,这个插件是一个dll,可以弄一个Qt ...

  7. qt web混合编程_VS2017+QT 混合编程-在VS控制台程序配置QT

    QT版本与VS版本 问题主要存在于2013与2017版本的切换,两个版本并不兼容,使用VS2017时候,平台工具集为141,此时如果使用的QT是msvc_2013相关,则会出现问题.建议两个软件的版本 ...

  8. 详解在QT中写控制台程序 实例

    详解在QT中写控制台程序 实例 在QT中写控制台程序 实例是本文介绍的内容,不多说了,先来看本文内容. AD: 本文介绍的是详解在QT中写控制台程序 实例,来看那内容.找到两种方法可以写控制台程序 第 ...

  9. qt 隐藏控制台_在控制台程序中隐藏控制台窗口

    大家都知道,当编写一个win32 console application时,当运行此类程序的时候 默认情况下会有一个类似DOS窗口的console窗口,但是有的时候我们只想在程序 中运行一段功能代码, ...

最新文章

  1. 小白如何在Windows如何安装双系统Centos7
  2. Android Studio 启动模拟器出现“Timed out after 300seconds waiting for emulator to come online“解决方案
  3. 第 4 章 Hypertable
  4. k30pro杀进程严重怎么解决_命运2掉帧严重怎么解决?提高帧数方法介绍
  5. mysql 修改数据 where_MySQL笔记之修改数据的解决方法
  6. MVC、MVP、MVVM分别是什么?有什么区别?
  7. 传惠普下周公布webOS平台最终命运
  8. Linux下套接字详解(补充)--OSI七层与TCP/IP五层网络架构详解
  9. centos7添加新网卡实现双IP双网关
  10. 学妹问我,并发问题的根源到底是什么?
  11. matlab编程设计fir滤波器,用MATLAB设计FIR滤波器
  12. 有效的数据处理:使用Tango库进行压缩和加密
  13. find函数常见错误_如何利用FIND找出你要的数据-EXCEL-开篇3-字符串函数系列-2
  14. java inflater_Android下LayoutInflater的正确使用姿势
  15. c语言打印long double,C/C++printf输出int、long、longlong、double、longdouble、string等
  16. 三十四、Expandable grid 可扩展的表格
  17. 【家庭网络】申请安装移动宽带过程及简单建议
  18. qlikview连接mysql_QlikView 通过ODBC 连接IBM DB2
  19. self-assessment
  20. 通过按位与和按位或操作

热门文章

  1. Java中如何遍历HashMap呢?
  2. 解决网易有道无法登陆,无法截屏翻译的方法。
  3. spice html5 鼠标漂移,SPICE-HTML5 鼠标指针BUG修复
  4. 计算机人应该如何高质量地度过大学四年
  5. python打开电子表格
  6. 轻松记海量Linux运维面试题
  7. python redis队列实现秒杀_redis实现简单延时队列
  8. 嵌入式开发中的堆与栈
  9. 向市场妥协的新旗舰 iPhone6 Plus评测
  10. iphone4开发基础教程的技术点总结3