qt控制台程序无法正常退出并回收资源
许多人创建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控制台程序无法正常退出并回收资源相关推荐
- Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法
Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法 最近由于老师要求要在Ubuntu下QT上进程多线程服务器的开发,虽然只是单纯的调用qt的network模块,但是为了避免麻烦,我 ...
- Qt 控制台程序正常退出
废话不多说,最近想写一个控制台程序,希望在执行完正常的代码后自动退出程序,研究了很久很久,看了很多办法,都不得行,最后可行的办法记录于此,避免以后再次入坑. 首先,Qt 程序正常退出的方式有如下几种: ...
- Qt 控制台程序:和原生C++的融入
网上看到几个案例还不错,可惜是用原生c++写的,QT工程不好使,这时候可以考虑用console程序,就是最原始的那种形式. 首先pro工程里,将gui替换成console: #------------ ...
- Qt应用程序图标设置任务栏图标设置
一.Qt应用程序图标设置 1.添加资源文件: 在vs资源视图中选中项目右键->添加->资源,选择icon或者version,vs会创建一个名叫"项目名称.rc"的资源文 ...
- 关于解决Win32控制台程序编译后自动退出
问题描述:Win32控制台程序编译运行后自动退出,看不到结果,解决此问题有如下几种方法: 使用CTRL+F5进行编译: 使用getchar()函数,放在程序的最后: 使用system("pa ...
- 使用C++控制台程序或Python调用Dll创建Qt界面(dll中创建QApplication,qtwinmigrate的使用)
目录 理论 构建DLL 使用Python进行调用 使用C++控制台程序进行调用 理论 在Windows下,可能要用MFC或C#或Java,python调用一个插件,这个插件是一个dll,可以弄一个Qt ...
- qt web混合编程_VS2017+QT 混合编程-在VS控制台程序配置QT
QT版本与VS版本 问题主要存在于2013与2017版本的切换,两个版本并不兼容,使用VS2017时候,平台工具集为141,此时如果使用的QT是msvc_2013相关,则会出现问题.建议两个软件的版本 ...
- 详解在QT中写控制台程序 实例
详解在QT中写控制台程序 实例 在QT中写控制台程序 实例是本文介绍的内容,不多说了,先来看本文内容. AD: 本文介绍的是详解在QT中写控制台程序 实例,来看那内容.找到两种方法可以写控制台程序 第 ...
- qt 隐藏控制台_在控制台程序中隐藏控制台窗口
大家都知道,当编写一个win32 console application时,当运行此类程序的时候 默认情况下会有一个类似DOS窗口的console窗口,但是有的时候我们只想在程序 中运行一段功能代码, ...
最新文章
- 小白如何在Windows如何安装双系统Centos7
- Android Studio 启动模拟器出现“Timed out after 300seconds waiting for emulator to come online“解决方案
- 第 4 章 Hypertable
- k30pro杀进程严重怎么解决_命运2掉帧严重怎么解决?提高帧数方法介绍
- mysql 修改数据 where_MySQL笔记之修改数据的解决方法
- MVC、MVP、MVVM分别是什么?有什么区别?
- 传惠普下周公布webOS平台最终命运
- Linux下套接字详解(补充)--OSI七层与TCP/IP五层网络架构详解
- centos7添加新网卡实现双IP双网关
- 学妹问我,并发问题的根源到底是什么?
- matlab编程设计fir滤波器,用MATLAB设计FIR滤波器
- 有效的数据处理:使用Tango库进行压缩和加密
- find函数常见错误_如何利用FIND找出你要的数据-EXCEL-开篇3-字符串函数系列-2
- java inflater_Android下LayoutInflater的正确使用姿势
- c语言打印long double,C/C++printf输出int、long、longlong、double、longdouble、string等
- 三十四、Expandable grid 可扩展的表格
- 【家庭网络】申请安装移动宽带过程及简单建议
- qlikview连接mysql_QlikView 通过ODBC 连接IBM DB2
- self-assessment
- 通过按位与和按位或操作