QT 訊號槽
阿新 • • 發佈:2018-12-23
QT的訊號槽機制用起來好用,看起來也比較清晰,隨時隨處可以繫結自己關係的訊號,非常方便。而且提供非同步,跨執行緒使用也很給力。在之前還想把這個機制擴充套件成一個專門處理任務的非同步佇列,實驗後發現不可行,多次繫結和發出訊號後記憶體就急劇上漲,最後分配不到記憶體了。但是作為普通的事件通知方式還是很好用的。
訊號可以從任何執行緒發出,如果繫結方式是direct那麼,參函式執行跟訊號發出是同一個執行緒,可以認為是直接呼叫。
如果繫結方式是queueconnect,那就要分情況:
1.槽函式繫結的物件和訊號在同一個執行緒,也就是說這個物件是在當前執行緒生成的,那麼訊號就被放到了當前執行緒的佇列中(不是直接呼叫), 等待當前執行緒去依次處理。
2.槽函式繫結的物件在其他執行緒生成,那麼這個訊號被放到其他執行緒的佇列中,等待其他執行緒去依次處理。
用queueconnnect模式繫結有個前提,就是接收方,也就是槽函式的執行執行緒必須有佇列。QT的主執行緒肯定有佇列,沒有訊息佇列QT這套也跑不起來。自己開的執行緒可沒有,這就需要自己顯示呼叫QEventLoop去建立訊息佇列,並且迴圈取佇列中的訊號,類似Windows的訊息迴圈,程式碼如下:
QEventLoop loop;
loop.exec();
另外凡是加入了訊號槽的類都會根據類標頭檔案生成一個moc檔案,這個moc檔案並不會帶有VS工程中的stdafx.h預編譯頭,這個時候如果工程設定了需要預編譯,那麼在編譯時會報錯。解決辦法是右鍵該標頭檔案開啟屬性,moc.exe選項引數prepend中加入stdafx.h這個標頭檔案就好,moc在生成對應檔案時會自動把stdafx.加入。