查看完整版本: [-- QT程序UI线程崩溃但其他线程正常运行? --]

QTCN开发网 -> Qt嵌入式开发 -> QT程序UI线程崩溃但其他线程正常运行? [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

9715866331 2017-11-15 19:10

QT程序UI线程崩溃但其他线程正常运行?

大家好,我写了一个QT程序,程序有一个很奇怪的BUG,我的程序中有一个主线程(UI线程)和一个写文件线程(QThread)和一个中断(SIGIO信号),程序实现的功能是在界面上点开始按钮后,如果接收到一个中断,就把数据加入队列,写文件线程读取队列后把数据写到硬盘中,写文件的数据较多,CPU一直30%左右,内存占用没有在增加,程序现在有一个BUG,就是写一段时间后(可能几分钟,可能几小时),界面就卡住了(不会恢复),什么反应都没有,程序中的QTimer中的打印也不运行了,但程序还在继续接收中断,写文件线程还在继续写文件,唯一的异常就是与界面有关的都卡住了,PS查看程序状态是S,终端也没有打印出任何异常信息,网上也没有找到类似的问题,求大神们帮帮忙
这是TOP的信息
[attachment=18161]


这个界面卡住时的打印,红框中的那句是主线程的QTimer打印出来的,其他是写文件线程和中断函数中的打印,可以看出QTimer中的打印突然没有了
[attachment=18162]


uidab 2017-11-15 20:54
和一个中断(SIGIO信号) 我是怀疑这里影响了QTimer
不知道你为什么还要这个信号,希望有更详细的信息。


9715866331 2017-11-16 08:54
uidab:不光是影响了QTimer,界面也卡住了,好像主线程突然就不运行了,用SIGIO信号是因为我有一个驱动程序,1秒钟会接收到一个中断 ,驱动接收到中断后我就异步通知QT程序
[图片]
这是QT中接收异步通知的初始化,接收到中断后调用my_signal_fun,my_signal_fun中读驱动的数据确定中断号正确后把相当地址的数据加入到队列
[图片]
然后就是写文件线程,先读队列,再写文件
[图片]
昨天晚上把QT程序打开,不点开始,也就是说不写文件到硬盘,程序运行了一晚上都没死,怀疑是CPU持续占用过高导致?
和一个中断(SIGIO信号) 我是怀疑这里影响了QTimer
不知道你为什么还要这个信号,希望有更详细的信息。



大家好,我写了一个QT程序,程序有一个很奇怪的BUG,我的程序中有一个主线程(UI线程)和一个写文件线程(QThread)和一个中断(SIGIO信号),程序实现的功能是在界面上点开始按钮后,如果接收到一个中断,就把数据加入队列,写文件线程读取队列后把数据写到硬盘中,写文件的数据较多,CPU一直30%左右,内存占用没有在增加,程序现在有一个BUG,就是写一段时间后(可能几分钟,可能几小时),界面就卡住了(不会恢复),什么反应都没有,程序中的QTimer中的打印也不运行了,但程序还在继续接收中断,写文件线程还在继续写文件,唯一的异常就是与界面有关的都卡住了,PS查看程序状态是S,终端也没有打印出任何异常信息,网上也没有找到类似的问题,求大神们帮帮忙
这是TOP的信息
[attachment=18161]


这个界面卡住时的打印,红框中的那句是主线程的QTimer打印出来的,其他是写文件线程和中断函数中的打印,可以看出QTimer中的打印突然没有了
[attachment=18162]


uidab 2017-11-16 11:17
个人也遇到过QTimer运行着的时候, 莫名其妙的再也不启动了,和你的输出类似。 幸运的是我们不卡界面。

后来就作了一个守护代码,看看是否定时器槽函数是否被执行。如果长时间没有运行就重启整个程序。 不知道这样操作会不会影响你的写文件。

9715866331 2017-11-16 14:14
uidab:个人也遇到过QTimer运行着的时候, 莫名其妙的再也不启动了,和你的输出类似。 幸运的是我们不卡界面。
后来就作了一个守护代码,看看是否定时器槽函数是否被执行。如果长时间没有运行就重启整个程序。 不知道这样操作会不会影响你的写文件。
 (2017-11-16 11:17) 

我也想过这种方法,我做的项目是数据记者录仪,数据的采集不能中断,所以要长时间稳定的运行才行,我在想是不是cached缓存太大了的原因,我试试每次写入后清除cached。谢谢你的解答

uidab 2017-11-16 15:56
9715866331:我也想过这种方法,我做的项目是数据记者录仪,数据的采集不能中断,所以要长时间稳定的运行才行,我在想是不是cached缓存太大了的原因,我试试每次写入后清除cached。谢谢你的解答[表情] (2017-11-16 14:14) 

这个问题,在好几个嵌入式板子上都遇到过,会不会是QTimer底层和Linux的信号有一些关系?更底层的就不知道了,多多交流吧。

sng2008 2017-11-16 22:30
一般都是主线程阻塞了。仔细检查主线程中运行的槽函数,是否有可能造成阻塞的情况。

9715866331 2017-11-20 09:16
sng2008:一般都是主线程阻塞了。仔细检查主线程中运行的槽函数,是否有可能造成阻塞的情况。 (2017-11-16 22:30) 

谢谢!终于解决了,确实是主线程阻塞了,原因是我在驱动中用到了异步通知,但不知道为什么异步通知会阻塞主线程,现在去掉异步通知连续运行了2天都没没卡


查看完整版本: [-- QT程序UI线程崩溃但其他线程正常运行? --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled