1. 程式人生 > >Qt 訊號-槽connect的同步與非同步處理

Qt 訊號-槽connect的同步與非同步處理

我們通常使用的connect,只用了四個引數,實際上最後一個引數使用的是Qt::AutoConnection型別。但如果訊號和槽函式是在不同執行緒(可以理解為不同cpp檔案裡的),那麼預設型別實際上是非同步的,往往會得不到我們想要的結果,特別是在串列埠通訊的時候。
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一樣。

    connect(this, SIGNAL(parseCurrentPos()), &gcode, SLOT(sendCurrentPos()),Qt::BlockingQueuedConnection);

    connect(&gcode, SIGNAL(sendMsg(QString)),this,SLOT(receiveMsg(QString)));