QT 訊號與槽不在同一個執行緒 connect
阿新 • • 發佈:2019-01-30
主執行緒中發出一個訊號,另一個執行緒槽函式沒有響應,這個問題搞了好幾個小時,才發現原來是connect時候的第5個引數寫錯了,在這裡做下備註吧。
connect用於連線qt的訊號和槽,在qt程式設計過程中不可或缺。它其實有第五個引數,只是一般使用預設值,在滿足某些特殊需求的時候可能需要手動設定。
Qt::AutoConnection: 預設值,使用這個值則連線型別會在訊號傳送時決定。如果接收者和傳送者在同一個執行緒,則自動使用Qt::DirectConnection型別。如果接收者和傳送者不在一個執行緒,則自動使用Qt::QueuedConnection型別。
Qt::DirectConnection:槽函式會在訊號傳送的時候直接被呼叫,槽函式運行於訊號傳送者所線上程。效果看上去就像是直接在訊號傳送位置呼叫了槽函式。這個在多執行緒環境下比較危險,可能會造成奔潰。
Qt::QueuedConnection:槽函式在控制回到接收者所線上程的事件迴圈時被呼叫,槽函式運行於訊號接收者所線上程。傳送訊號之後,槽函式不會立刻被呼叫,等到接收者的當前函式執行完,進入事件迴圈之後,槽函式才會被呼叫。多執行緒環境下一般用這個。
Qt::BlockingQueuedConnection:槽函式的呼叫時機與Qt::QueuedConnection一致,不過傳送完訊號後傳送者所線上程會阻塞,直到槽函式執行完。接收者和傳送者絕對不能在一個執行緒,否則程式會死鎖。在多執行緒間需要同步的場合可能需要這個。
Qt::UniqueConnection:這個flag可以通過按位或(|)與以上四個結合在一起使用。當這個flag設定時,當某個訊號和槽已經連線時,再進行重複的連線就會失敗。也就是避免了重複連線。