Qt程序 windows环境长时间运行,界面卡顿,需要重启操作系统

疯魔症 2018-01-19 09:50:28
Qt4.8开发的软件,只在windows跑,在用户环境出现几次卡顿不响应的现象,重启软件仍然卡顿不响应,重启操作系统后软件正常。

先说下软件,软件是需要长时间运行的,设计一些数据采集,曲线列表等等的界面,我的开发环境很稳定,用户的环境中跑也很稳定,CPU稳定在10%左右,内存一百多M。但是呢出现了几次情况。

我本地的开发环境,win10,Qt4.8 for vs2008,Qt Creator

第一种现象,用户的几台计算经win8,win10,win7,平时跑都正常,有一次出现界面卡顿点击不响应,重启软件也不管用,由于用户计算机重来不关闭(几个月),我要求用户重启计算机,重启后软件正常,我的解释是,windows本身不稳定,长时间跑图形界面软件需要定期重启。

第二个现象,最近用户部署一台新的计算机,win7,启动软件点击鼠标只有几个控件会响应,具体现象:例如点击按钮,只有个别按钮响应点击,例如QTabWidget,点击tab也没响应,软件中使用了多个QTabWidget,软件重启也不行,每次重启软件后响应的按钮也不同;我做了一些尝试,软件启动后,使用它tab键,可以切换不同按钮的焦点,可以切换QTabWidget的tab焦点;另一个尝试,我编译了一个简单的Qt程序,只有一个QTabWidget控件,几个按钮几个editLabel,也有同一样的现象,鼠标点击不能都响应,tab键可以切换各控件的焦点。

请教下这两个现象怎么解释,万分感谢
...全文
7402 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_37669007 2021-03-09
  • 打赏
  • 举报
回复
引用 22 楼 张小飞WPS 的回复:
[quote=引用 9 楼 tajon1226 的回复:] [quote=引用 8 楼 u010370871 的回复:] [quote=引用 5 楼 tajon1226 的回复:] QT4.8有点老了吧,QT是比较吃内存
你告诉我Qt4.8跟最新的Qt5.10在widget那套东西差别大么? 5.x widget那套根本变化很小。至于吃不吃内存写C++的还不能自己控制?[/quote] c++吃不吃内存跟写代码的人有关系,和语言没有必要关系;我话外之音说的就是写QT框架的人写的代码比较吃内存。[/quote] 那你回一句 “QT是比较吃内存” ,搞得像是Qt的锅[/quote] 哥们,请问你这个问题解决了没,我最近也遇到了类似的问题,QT写的一个应用程序连续运行一段时间后win7系统会变得卡顿,重启软件不好使只能重启电脑
术业专攻 2018-12-19
  • 打赏
  • 举报
回复
楼主,请问你这个问题最终怎么解决的,我现在嵌入式linux下Qt程序也出现了这个问题,大概连续运行十几天后会变得很卡,重启一下软件就好了
比菜鸟还菜 2018-05-07
  • 打赏
  • 举报
回复
句柄是个问题。以前做过一个snmp的软件,因为句柄一直申请,导致系统会出现乱七八糟的错误,甚至弹框的不是程序本身而是系统的。
feiyangqingyun 2018-05-07
  • 打赏
  • 举报
回复
这种情况八成是程序没写好。
我用Qt写的安防系统在WIN7和XP上稳定运行300天以上。建议你仔细查下程序是不是哪里内存泄漏了!或者遇到什么特殊情况没有处理到的。或者是不是你电脑系统本身有问题!换一台配置高的电脑试试!

beyond513222 2018-05-05
  • 打赏
  • 举报
回复
可能是内存泄露吧,看看内存占用
  • 打赏
  • 举报
回复
我的建议,是耐心排除调试。 1、可以在Linux下使用valgrind直接调试内存泄漏。但是,若硬件设备的程序驱动只有windows下的,比较麻烦。可以屏蔽硬件部分,直接做一个假的数据源,在linux下测试。这种方法屡试不爽,发现了好多很隐晦的内存泄漏。 2、一般,不恰当的使用和显示有关的句柄、隐含的创建一些临时资源却忘记release,都有可能导致内存泄漏。 3、如果7x24小时运行的东西,架构上不建议加入不断刷新显示的东西。一般我们都是用一个控制台服务(黑屏幕程序)进行不断的处理、一个显控终端负责监视。把处理和监控分开来设计,看似麻烦,实则很科学。
besterector 2018-04-09
  • 打赏
  • 举报
回复
看 dump 文件啊
  • 打赏
  • 举报
回复
应该是内存泄漏的问题。 用Qt 4.8、Qt5.7 两个版本做7*24小时应用,半年也没有重启过。 我们做Qt测试,既然是跨平台,建议在 Linux 下先用 valgrind 运行一段时间,把内存泄漏全部清除了,再转移到Windows valgrind是一个神奇的东西,可惜windows下不支持。
萧洛 2018-03-15
  • 打赏
  • 举报
回复
1.跟踪内存是否有泄漏。 记录程序开启和程序变卡时的占用内存大小 2.是否用多线程实现功能 如果用单线程实现,多个功能在执行时也会变卡 (本人用的是VS2013+QT5.8没出现过此类现象)
张小飞Official 2018-02-05
  • 打赏
  • 举报
回复
引用 9 楼 tajon1226 的回复:
[quote=引用 8 楼 u010370871 的回复:] [quote=引用 5 楼 tajon1226 的回复:] QT4.8有点老了吧,QT是比较吃内存
你告诉我Qt4.8跟最新的Qt5.10在widget那套东西差别大么? 5.x widget那套根本变化很小。至于吃不吃内存写C++的还不能自己控制?[/quote] c++吃不吃内存跟写代码的人有关系,和语言没有必要关系;我话外之音说的就是写QT框架的人写的代码比较吃内存。[/quote] 那你回一句 “QT是比较吃内存” ,搞得像是Qt的锅
疯魔症 2018-01-31
  • 打赏
  • 举报
回复
引用 19 楼 u010111033 的回复:
[quote=引用 4 楼 zwb0540822 的回复:] 谢谢2楼3楼的回复 2楼可不可帮我分析现象,我怀疑是不是Qt的底层机制和windows底层机制有什么联系,导致Qt软件长时间运行把windows的某些资源耗尽,必须重启操作系统才可以。 3楼没有细看问题描述,出现问题时,软件重启也不能解决,必须重启操作系统,出现问题时系统的CPU、内存都很正常
至于内存泄漏,就是内存没正确释放,你不要关注什么方式导致,只要是堆里面动态分配的没正确释放都会导致这问题。我们先扔下这个问题,先看别的。 1、测试基本的Qt的Demo是否还是这个问题,比如只有界面的程序,带动态更新界面的程序。[/quote] 出问题时我做过测试了,QtCreator建立的dialog工程,放了几个基本的控件,也有一样的现象,鼠标点击只有个别控件有响应,用键盘的tab可以切换各控件的焦点。 所以我也就郁闷了,去年秋天在用户的现场出现过一次,重启计算机就好,我就没当会事,最近又出现了两次,我开始重视这个问题了,肯定是有bug呀。
Little柯南 2018-01-31
  • 打赏
  • 举报
回复
引用 4 楼 zwb0540822 的回复:
谢谢2楼3楼的回复 2楼可不可帮我分析现象,我怀疑是不是Qt的底层机制和windows底层机制有什么联系,导致Qt软件长时间运行把windows的某些资源耗尽,必须重启操作系统才可以。 3楼没有细看问题描述,出现问题时,软件重启也不能解决,必须重启操作系统,出现问题时系统的CPU、内存都很正常
至于内存泄漏,就是内存没正确释放,你不要关注什么方式导致,只要是堆里面动态分配的没正确释放都会导致这问题。我们先扔下这个问题,先看别的。 1、测试基本的Qt的Demo是否还是这个问题,比如只有界面的程序,带动态更新界面的程序。
Little柯南 2018-01-31
  • 打赏
  • 举报
回复
你直接做个Qt自动生成的QWidgets软件吧。里面就一个widget,让他显示,他自身也带最大最小关闭,在一定时间后看这个情况如何,是不是也无响应。如果这个都无响应,那么就是操作系统与QT软件的匹配有问题。另外在QT发布包里面有这个东西,vcredist_msvc2015_x86.exe类似的是否目标客户端装了?
Little柯南 2018-01-31
  • 打赏
  • 举报
回复
windows系统确实不适合作为服务器一样一年之久不关机! 实在不行,建议你做以下2种设置: 1、写注册表,做开机启动设置; 2、软件自身,做一定时间的监测,到时对windows系统关机重启,此时软件又开机重启。 现在要么从自身软件找问题,但是你基本dialog都有这情况,那只能说Qt与你那个windows兼容有一定匹配问题。而我这边做工控linux不存在你说的问题,几个月一年不关机,也没问题。具体版本号Qt4.8.6、Qt5.6.2. 要么就从解决之道来想办法来妥协或者降低发生,所以以上是我给你的建议。
Little柯南 2018-01-30
  • 打赏
  • 举报
回复
先说软件框架: 1、是不是开线程接收数据,主线程做显示?导致数据接收对主线程界面造成卡顿; 2、接收数据大概多长时间一次,也就是频率,而这个频率是否可以完成主界面图形绘制?如果发送来的数据过快,而绘图处理不能在这个时间完成,是否考虑过抛帧方案? 3、信号槽的处理,是按照队列走还是阻塞走?队列走,存在2所在问题的话,在一定时间过后,会持续增加内存!
疯魔症 2018-01-30
  • 打赏
  • 举报
回复
引用 16 楼 u010111033 的回复:
先说软件框架: 1、是不是开线程接收数据,主线程做显示?导致数据接收对主线程界面造成卡顿; 2、接收数据大概多长时间一次,也就是频率,而这个频率是否可以完成主界面图形绘制?如果发送来的数据过快,而绘图处理不能在这个时间完成,是否考虑过抛帧方案? 3、信号槽的处理,是按照队列走还是阻塞走?队列走,存在2所在问题的话,在一定时间过后,会持续增加内存!
首先谢谢你的持续回复,我想知道你说的内存泄露,具体指哪些(new,malloc,windows的CreateXXX),必须重启操作系统才能回收。我一致强调出现几次问题时,启动最简单的一个Qt程序,鼠标点击不能响应,必须重启计算机。我查了一些信息,说是windows的内核资源,不正确释放的话在进程结束后,windows会仍然保留的,导致内核资源泄露,具体的查证方法我还在找资料。
Little柯南 2018-01-29
  • 打赏
  • 举报
回复
我的建议是: 1、防止用户多开情况,主界面做成单例模式; 2、主界面使用Qt,如果你在持续接收数据使用多线程的话,我建议你直接继承QObject,然后使用std::thread调用,同时在线程处理数据方面,使用智能指针,防止不必要的内存泄漏。这样也保证了信号槽的传递;
疯魔症 2018-01-29
  • 打赏
  • 举报
回复
引用 14 楼 u010111033 的回复:
我的建议是: 1、防止用户多开情况,主界面做成单例模式; 2、主界面使用Qt,如果你在持续接收数据使用多线程的话,我建议你直接继承QObject,然后使用std::thread调用,同时在线程处理数据方面,使用智能指针,防止不必要的内存泄漏。这样也保证了信号槽的传递;
引用 14 楼 u010111033 的回复:
我的建议是: 1、防止用户多开情况,主界面做成单例模式; 2、主界面使用Qt,如果你在持续接收数据使用多线程的话,我建议你直接继承QObject,然后使用std::thread调用,同时在线程处理数据方面,使用智能指针,防止不必要的内存泄漏。这样也保证了信号槽的传递;
我可以按你说的修改下,但是我一致强调软件重启仍然有问题,必须重启操作系统。普通的内存泄露在软件退出后,操作系统会收回,我这个问题是不是涉及Qt和Windows的某些机制。 另外我在公司搭建了测试环境,连续跑了8天没问题,没绘制曲线图内存稳定在一百兆左右。
Acuity. 2018-01-28
  • 打赏
  • 举报
回复
QT4.8是最稳定的qt版本,各大工控、Windows应用依然首先QT4.8。楼上说都把锅甩给QT4.8,这个不太可能,检查下是否有内存泄漏吧。
疯魔症 2018-01-28
  • 打赏
  • 举报
回复
引用 12 楼 u010111033 的回复:
一般而言,是内存泄漏!
内存泄露重启软件也就正常了吧,我这个现象重启软件也不行,而且CPU、内存、磁盘读写都很正常,必须重启操作系统软件才能使用
加载更多回复(11)

16,199

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧