使用信號和槽機制,要注意以下問題:
1、信號和槽的機制是非常有效的,但是它不像“真正的”回調那樣快。信號和槽稍微有些慢,這是因為它們所提供的靈活性。但這種損失相對來說是比較小的。但要追求高效率的話,比如在實時系統中就要盡量少用這種機制。
2、信號和槽機制與普通函數的調用一樣,如果使用不當的話,在程序執行時有可能形成死循環,所以,在定義槽函數時一定要注意避免間接形成無限循環,即在槽中再次發射所接收到的同樣的信號。
3、如果一個信號和多個槽相關聯的話,那當這個信號被發射時,與之相關聯的槽的執行順序將是髓機的,且順序不能指定。
4、宏定義不能用在signal和slot的參數中。
5、構造函數不能用在signals和slots聲明區域內。
6、函數指針不能作為信號或槽的參數。
7、信號和槽不能有缺省參數值。
8、信號和槽不能攜帶模板類參數。
9、嵌套的類不能位於信號和槽區域內,也不能有信號或者槽。
10、友元聲明不能位於信號和槽的聲明區域內。
參考:
http://blog.csdn.net/hufengvip/article/details/6580553
---------------------------------------------------------------------
通常使用的connect,實際上最后一個參數使用的是Qt::AutoConnection類型:
Qt支持6種連接方式,其中3中最主要:
Qt::DirectConnection(直連方式)
當信號發出后,相應的槽函數將立即被調用。emit語句后的代碼將在所有槽函數執行完畢后被執行。(信號與槽函數關系類似於函數調用,同步執行)
Qt::QueuedConnection(排隊方式)
當信號發出后,排隊到信號隊列中,需等到接收對象所屬線程的事件循環取得控制權時才取得該信號,調用相應的槽函數。emit語句后的代碼將在發出信號后立即被執行,無需等待槽函數執行完畢。(此時信號被塞到信號隊列里了,信號與槽函數關系類似於消息通信,異步執行)
Qt::AutoConnection(自動方式)
Qt的默認連接方式,如果信號的發出和接收這個信號的對象同屬一個線程,那個工作方式與直連方式相同;否則工作方式與排隊方式相同。
參見文章:http://blog.csdn.net/qq419036154/article/details/6112503
追問
如果第五個參數沒加的話,默認表示的是同步還是異步呢?
回答
沒加的話與直連方式相同:當信號發出后,相應的槽函數將立即被調用。emit語句后的代碼將在所有槽函數執行完畢后被執行。(信號與槽函數關系類似於函數調用,同步執行)
個人覺得,在這個線程內是順序執行、同步的,但是與其它線程之間肯定是異步的了。如果使用多線程,仍然需要手動同步。
參考:
http://zhidao.baidu.com/question/424073495.html
-------------------------------------------------------------
Qt中線程跟信號槽的關系
http://wan-2004.iteye.com/blog/1169265