問題描述:
我的工程使用UDP進行通信,初始程序運行正常。運行一段時間后,udp正常接收數據,並且成功將收到的數據發出信號,但是此時不執行槽函數。 並且界面出現卡死現象。
猜想可能:
線程阻塞、對象異常銷毀(總感覺沒有遇到過,后邊發覺確實想多了)
后續解決:
1.使用數據庫連接池的時候只是增加db,每次使用完畢未將db置為空閑狀態,導致各個模塊獲取db並且db數據量大於等於最大連接數的時候,獲取db的時候產生死循環等待。
2.多個模塊共用一個線程,某幾個模塊耗時過長,導致接收數據槽函數的對象所在線程死鎖。
3.某個模塊使用數據庫查詢數據的時候使用while循環,每次循環將獲取的數據不斷發送前端,而我忘記對query進行break,導致后台不斷向界面發送數據,界面卡死。(界面卡死的原因)
偽代碼:
{ //改用數據庫使用
db = getDb(); //獲取db
use... db; //使用db
removeDb(&db);//移除db或者將db置為空閑狀態。
}
{ //耗時線程單獨開線程
Model modeRcv; //數據接收槽函數所在線程
Model_ modeOther;
//數據接收槽函數所在模塊單獨開辟一個線程
modeRcv.moveToThread(&thread1);
modeOther.moveToThread(&thread2);
}
補充:
后續遇到問題:當數據庫異常的時候,整個后台處理變慢、甚至卡死。
原因:1.數據庫讀寫和業務處理公用線程,當數據庫異常的時候,db.open()函數的返回時間大於10s(可以通過函數設置,但是最少不低於2s),這些頻繁open耗時過長導致程序卡頓。 2.獲取db的操作使用了工具類實現,工具類中含有線程鎖。當數據庫異常的時候調用數據庫連接清理函數的時候,導致死鎖。即獲取db的函數和清理連接函數公用一個鎖,重復加鎖導致死鎖。
解決辦法:1.將所有數據庫操作單獨放置一個線程:
優點:程序開啟的線程少,消耗cpu較少。
缺點:操作數據庫的模塊划分耦合度會比較高。
2.在各個模塊把數據庫操作放入一個和業務不同的線程操作:
優點:各個模塊耦合度比較低。
缺點:程序開啟的線程多,消耗cpu較多。
3.去掉清理數據庫連接函數中的加鎖操作。