QT 訊號已發出,但是槽函式未執行

2022-09-06 06:12:13 字數 1183 閱讀 8817

問題描述

我的工程使用udp進行通訊,初始程式執行正常。執行一段時間後,udp正常接收資料,並且成功將收到的資料發出訊號,但是此時不執行槽函式。 並且介面出現卡死現象。

猜想可能:

執行緒阻塞、物件異常銷毀(總感覺沒有遇到過,後邊發覺確實想多了)

後續解決:

1.使用資料庫連線池的時候只是增加db,每次使用完畢未將db置為空閒狀態,導致各個模組獲取db並且db資料量大於等於最大連線數的時候,獲取db的時候產生死迴圈等待。

3.某個模組使用資料庫查詢資料的時候使用while迴圈,每次迴圈將獲取的資料不斷傳送前端,而我忘記對query進行break,導致後台不斷向介面傳送資料,介面卡死。(介面卡死的原因)

偽**:

{ //改用資料庫使用

db = getdb(); //獲取db

use... db; //使用db

removedb(&db);//移除db或者將db置為空閒狀態。

{ //耗時執行緒單獨開執行緒

model_ modeother; 

//資料接收槽函式所在模組單獨開闢乙個執行緒

modercv.movetothread(&thread1);

modeother.movetothread(&thread2);

補充:

後續遇到問題:當資料庫異常的時候,整個後台處理變慢、甚至卡死。

原因:1.資料庫讀寫和業務處理公用執行緒,當資料庫異常的時候,db.open()函式的返回時間大於10s(可以通過函式設定,但是最少不低於2s),這些頻繁open耗時過長導致程式卡頓。 2.獲取db的操作使用了工具類實現,工具類中含有執行緒鎖。當資料庫異常的時候呼叫資料庫連線清理函式的時候,導致死鎖。即獲取db的函式和清理連線函式公用乙個鎖,重複加鎖導致死鎖。

解決辦法:1.將所有資料庫操作單獨放置乙個執行緒:

優點:程式開啟的執行緒少,消耗cpu較少。

缺點:運算元據庫的模組劃分耦合度會比較高。

2.在各個模組把資料庫操作放入乙個和業務不同的執行緒操作:

優點:各個模組耦合度比較低。

缺點:程式開啟的執行緒多,消耗cpu較多。

3.去掉清理資料庫連線函式中的加鎖操作。

Qt 槽函式中獲取發出訊號的物件

核心 qobject sender 對於訊號與槽的連線 connect obj1 signal sigfun obj2 slot slotfun 或者connect obj1 object1 sigfun obj2 object2 slotfun 可以通過訊號與槽函式的引數來傳遞資料 但是存在一些情...

Qt 槽函式中獲取發出訊號的物件

核心 qobject sender 對於訊號與槽的連線 connect obj1 signal sigfun obj2 slot slotfun 或者connect obj1 object1 sigfun obj2 object2 slotfun 可以通過訊號與槽函式的引數來傳遞資料 但是存在一些情...

QT 訊號與槽有連線 槽未響應

日常錯誤記錄 在連線訊號和槽時 訊號和槽的引數要一一對應,名字空間也要對應 錯誤 connect p topshapematchthread,signal send result halconcpp hobject,qstring,bool this,slot on getimagefromdotg...