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

1.簡介

由於在主線程以及多線程中對GUI進行繪畫刷新,導致了出現莫名其妙的問題。例如:
1、在程序運行了一段時間後,程序UI不會刷新,運行的獲取當前程序時間的程序一直在運行,但是不會將當前時間顯示到界面上,其他後臺顯示信息,一切正常。經過鼠標的再次點擊,程序會暫時恢復正常或者是直接程序終止退出。

2、出現QT gui界面假死現象(即是後臺顯示程序運行正常,結果是界面一直不刷新,並且top查看進行使用時,顯示佔用cpu 0.0%)

3、程序進程突然退出,後臺gdb調試core dump文件打印如下:
 

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

原因在QT的run函數中調用了一個fun1函數,而fun1函數調用update()函數(這個用來刷新界面)

void my_pthread::run()
{
    while (1) {
        fun1();
    }
}

void widget::fun1()
{
    //對Qlable顯示圖像的一些操作
    update();
}

結論:經過多個方面連續兩天的調試,才發現原來是不小心將消息狀態更新接口寫在更新線程裏面,在此之前,已經設計爲線程只是用作消息的獲取,刷新界面等操作,主要還是放在主進程裏面,線程獲取的消息,通過信號和槽,通知主進程進行相應的刷新顯示。所以在此,再次強調不能將UI刷新放在線程上面,必須放在主進程裏面,切記,切記,切記!!!

2. 原因

在此,貼上相關資料:
線程中的事件循環使線程可以使用某些需要存在事件循環的非GUI Qt類(例如QTimer,QTcpSocket和QProcess)

Qt 5.6 Threads and QObjects

3.參考鏈接

  1. http://www.qtcn.org/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

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章