Qt 訊號-槽的同步與非同步處理
通常使用的connect,實際上最後一個引數使用的是Qt::AutoConnection型別:Qt支援6種連線方式,其中3中最主要:
1.Qt::DirectConnection(直連方式)(訊號與槽函式關係類似於函式呼叫,同步執行)
當訊號發出後,相應的槽函式將立即被呼叫。emit語句後的程式碼將在所有槽函式執行完畢後被執行。
2.Qt::QueuedConnection(排隊方式)(此時訊號被塞到訊號佇列裡了,訊號與槽函式關係類似於訊息通訊,非同步執行)
當訊號發出後,排隊到訊號佇列中,需等到接收物件所屬執行緒的事件迴圈取得控制權時才取得該訊號,呼叫相應的槽函式。emit語句後的程式碼將在發出訊號後立即被執行,無需等待槽函式執行完畢。
3.Qt::AutoConnection(自動方式)
Qt的預設連線方式,如果訊號的發出和接收這個訊號的物件同屬一個執行緒,那個工作方式與直連方式相同;否則工作方式與排隊方式相同。
4.Qt::BlockingQueuedConnection(訊號和槽必須在不同的執行緒中,否則就產生死鎖)
這個是完全同步佇列只有槽執行緒執行完成才會返回,否則傳送執行緒也會一直等待,相當於是不同的執行緒可以同步起來執行。
5.Qt::UniqueConnection
與預設工作方式相同,只是不能重複連線相同的訊號和槽,因為如果重複連線就會導致一個訊號發出,對應槽函式就會執行多次。
6.Qt::AutoCompatConnection
是為了連線Qt4與Qt3的訊號槽機制相容方式,工作方式與Qt::AutoConnection一樣。
如果這個引數不設定的話,預設表示的是那種方式呢?
沒加的話與直連方式相同:當訊號發出後,相應的槽函式將立即被呼叫。emit語句後的程式碼將在所有槽函式執行完畢後被執行。在這個執行緒內是順序執行、同步的,但是與其它執行緒之間肯定是非同步的了。如果使用多執行緒,仍然需要手動同步。