QT 信號已發出,但是槽函數未執行


問題描述

  我的工程使用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.去掉清理數據庫連接函數中的加鎖操作。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM