qt訊號槽跨執行緒使用時候的坑

2021-10-03 16:09:40 字數 630 閱讀 7290

訊號槽connect的時候擴充套件有5種,在跨執行緒使用的時候選擇不同的引數會有不同的效果,使用不當會造成執行緒同步甚至崩潰的問題。5種引數的意義不再累述,可以參考 訊號槽的多執行緒安全性討論

跨執行緒觸發槽的時候,因為訊號和槽不在乙個執行緒內需要考慮同步問題(參考 訊號槽的多執行緒安全性討論),比較簡單的方式是槽函式加全域性鎖。除此之外還有乙個更簡單的方式,就是connect的使用direct connection (直接連線),這種連線方式將會使槽函式在訊號發出的執行緒中直接執行,這種情況業務處理實際就變成了單執行緒,併發問題自然沒有了。

但是這種情況有乙個致命問題,比如a,b分屬兩個執行緒,a使用直連方式呼叫b的槽函式,其實是在a執行緒內建立了乙個b的臨時物件,然後呼叫b的槽函式。b的臨時物件是使用預設建構函式建立的,如果b沒有預設建構函式,這種情況執行程式將會直接崩潰。

qt官方文件上也有說明這一使用方式的不安全性,只是沒有說明具體的原因。建議跨執行緒時不要使用direct connection去解決同步問題。

這種情況沒什麼太好的解決方式,只能是在程式設計的時候盡量避免。

訊號槽在提供便利性的同時不僅犧牲了效率,而且造成了使用的複雜性,qt中類似的坑有很多。個人感覺qt的優勢還是在於介面,非介面開發的時候綜合開發體驗還是比c++11和boost差的太多了,這又是另乙個話題了。

Qt跨執行緒的訊號和槽的使用

connect用於連線qt的訊號和槽,在qt程式設計過程中不可或缺。它其實有第五個引數,只是一般使用預設值,在滿足某些特殊需求的時候可能需要手動設定。qt autoconnection 1 ifndef mainwindow h 2 define mainwindow h 3 4 include 5...

QT訊號槽的跨執行緒連線

qt中的執行緒可以通過繼承qthread類,重寫run 函式,run 函式即新執行緒的入 通過start 函式啟動新執行緒 我我們實現的這個qthread的派生類,只不過是用來管理執行緒的。run 函式返回,新執行緒結束,可以在呼叫 exec 函式,在新執行緒中也開啟時間迴圈。繼承自qobject的...

QT跨執行緒連線訊號和槽

對qt的訊號和槽理解較為初級,今天通過多次嘗試,終於學會了跨執行緒連線訊號和槽。其基本方法如下。1.無引數傳遞時 1 定義 signal void signal1 2 連線部分寫法 connect p class1,類1的指標 signal signal1 類1的訊號 p class2,類2的指標 ...