标题:QT程序UI线程崩溃但其他线程正常运行?
作者:9715866331
日期:2017-11-15 19:10
内容:
大家好,我写了一个QT程序,程序有一个很奇怪的BUG,我的程序中有一个主线程(UI线程)和一个写文件线程(QThread)和一个中断(SIGIO信号),程序实现的功能是在界面上点开始按钮后,如果接收到一个中断,就把数据加入队列,写文件线程读取队列后把数据写到硬盘中,写文件的数据较多,CPU一直30%左右,内存占用没有在增加,程序现在有一个BUG,就是写一段时间后(可能几分钟,可能几小时),界面就卡住了(不会恢复),什么反应都没有,程序中的QTimer中的打印也不运行了,但程序还在继续接收中断,写文件线程还在继续写文件,唯一的异常就是与界面有关的都卡住了,PS查看程序状态是S,终端也没有打印出任何异常信息,网上也没有找到类似的问题,求大神们帮帮忙
这是TOP的信息
这个界面卡住时的打印,红框中的那句是主线程的QTimer打印出来的,其他是写文件线程和中断函数中的打印,可以看出QTimer中的打印突然没有了
#1 [uidab 11-15 20:54]
和一个中断(SIGIO信号) 我是怀疑这里影响了QTimer
不知道你为什么还要这个信号,希望有更详细的信息。
#2 回 uidab 的帖子 [9715866331 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的信息
这个界面卡住时的打印,红框中的那句是主线程的QTimer打印出来的,其他是写文件线程和中断函数中的打印,可以看出QTimer中的打印突然没有了
#3 [uidab 11-16 11:17]
个人也遇到过QTimer运行着的时候, 莫名其妙的再也不启动了,和你的输出类似。 幸运的是我们不卡界面。
后来就作了一个守护代码,看看是否定时器槽函数是否被执行。如果长时间没有运行就重启整个程序。 不知道这样操作会不会影响你的写文件。
#4 回 uidab 的帖子 [9715866331 11-16 14:14]
uidab:个人也遇到过QTimer运行着的时候, 莫名其妙的再也不启动了,和你的输出类似。 幸运的是我们不卡界面。
后来就作了一个守护代码,看看是否定时器槽函数是否被执行。如果长时间没有运行就重启整个程序。 不知道这样操作会不会影响你的写文件。
(2017-11-16 11:17)
我也想过这种方法,我做的项目是数据记者录仪,数据的采集不能中断,所以要长时间稳定的运行才行,我在想是不是cached缓存太大了的原因,我试试每次写入后清除cached。谢谢你的解答
#5 回 9715866331 的帖子 [uidab 11-16 15:56]
9715866331:我也想过这种方法,我做的项目是数据记者录仪,数据的采集不能中断,所以要长时间稳定的运行才行,我在想是不是cached缓存太大了的原因,我试试每次写入后清除cached。谢谢你的解答 (2017-11-16 14:14)
这个问题,在好几个嵌入式板子上都遇到过,会不会是QTimer底层和Linux的信号有一些关系?更底层的就不知道了,多多交流吧。