分享

QT线程引发Backtrace stopped: previous frame identical to this frame (corrupt stack?)

 slimfeng 2019-12-12

1.简介

由于在主线程以及多线程中对GUI进行绘画刷新,导致了出现莫名其妙的问题。例如:
1、在程序运行了一段时间后,程序UI不会刷新,运行的获取当前程序时间的程序一直在运行,但是不会将当前时间显示到界面上,其他后台显示信息,一切正常。经过鼠标的再次点击,程序会暂时恢复正常或者是直接程序终止退出。

2、出现QT gui界面假死现象(即是后台显示程序运行正常,结果是界面一直不刷新,并且top查看进行使用时,显示占用cpu 0.0%)

3、程序进程突然退出,后台gdb调试core dump文件打印如下:
 

  1. 1. Core was generated by `qtgui'.
  2. 2. Program terminated with signal 6, Aborted.
  3. 3. #0 0xb6e04f1c in raise () from /lib/libc.so.0
  4. 4. (gdb) bt
  5. 5. #0 0xb6e04f1c in raise () from /lib/libc.so.0
  6. 6. #1 0xb6dff52c in abort () from /lib/libc.so.0
  7. 7. #2 0xb6dfed68 in ?? () from /lib/libc.so.0
  8. 8. #3 0xb6dfed68 in ?? () from /lib/libc.so.0
  9. 9. Backtrace stopped: previous frame identical to this frame (corrupt stack?)
  10. 10. (gdb)

原因在QT的run函数中调用了一个fun1函数,而fun1函数调用update()函数(这个用来刷新界面)

  1. void my_pthread::run()
  2. {
  3. while (1) {
  4. fun1();
  5. }
  6. }
  7. void widget::fun1()
  8. {
  9. //对Qlable显示图像的一些操作
  10. update();
  11. }

结论:经过多个方面连续两天的调试,才发现原来是不小心将消息状态更新接口写在更新线程里面,在此之前,已经设计为线程只是用作消息的获取,刷新界面等操作,主要还是放在主进程里面,线程获取的消息,通过信号和槽,通知主进程进行相应的刷新显示。所以在此,再次强调不能将UI刷新放在线程上面,必须放在主进程里面,切记,切记,切记!!!

2. 原因

在此,贴上相关资料:
线程中的事件循环使线程可以使用某些需要存在事件循环的非GUI Qt类(例如QTimer,QTcpSocket和QProcess)

Qt 5.6 Threads and QObjects

3.参考链接

  1. http://www./bbs/simple/?t61849.html
  2. https://blog.csdn.net/wb175208/article/details/82634466
  3. https://ask.csdn.net/questions/151609
  4. https://blog.csdn.net/quange_style/article/details/90696417

 

 

 

 

 

 

 

 

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多