• 6206阅读
  • 7回复

QT程序UI线程崩溃但其他线程正常运行? [复制链接]

上一主题 下一主题
离线9715866331
 

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



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


离线uidab

只看该作者 1楼 发表于: 2017-11-15
和一个中断(SIGIO信号) 我是怀疑这里影响了QTimer
不知道你为什么还要这个信号,希望有更详细的信息。

有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线9715866331

只看该作者 2楼 发表于: 2017-11-16
回 uidab 的帖子
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

只看该作者 3楼 发表于: 2017-11-16
个人也遇到过QTimer运行着的时候, 莫名其妙的再也不启动了,和你的输出类似。 幸运的是我们不卡界面。

后来就作了一个守护代码,看看是否定时器槽函数是否被执行。如果长时间没有运行就重启整个程序。 不知道这样操作会不会影响你的写文件。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线9715866331

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

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

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

这个问题,在好几个嵌入式板子上都遇到过,会不会是QTimer底层和Linux的信号有一些关系?更底层的就不知道了,多多交流吧。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线sng2008

只看该作者 6楼 发表于: 2017-11-16
一般都是主线程阻塞了。仔细检查主线程中运行的槽函数,是否有可能造成阻塞的情况。
离线9715866331

只看该作者 7楼 发表于: 2017-11-20
回 sng2008 的帖子
sng2008:一般都是主线程阻塞了。仔细检查主线程中运行的槽函数,是否有可能造成阻塞的情况。 (2017-11-16 22:30) 

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