2015-02-08 82 views
2

許多QT例子做了以下事情:Qt的:信號時隙通通過const引用

signal: passByConstRef(const QImage &) 
slot: receivedByConstRef(const QImage &) 

它們通過在不同的線程排隊連接進行連接。 在線程1:

{QImage image; 
image = fromData(...); 
emit passByConstRef(image); 
} 

在線程2:

receivedByConstRef(const QImage& image){ 
    ... 
    pixmap = fromImage(image); 
    ... 
} 

由於信號時隙由常量參考,這意味着沒有複製的發生,使QImage的纔有可能的是,當「像素映像」正在構建中,線程1中「圖像」的生命週期結束並導致在線程2中構建「像素映射」失敗。

回答

6

當您通過引用傳遞參數時,副本將在排隊中發送連接。事實上,當你有一個排隊連接時,參數總是被複制。所以在這裏就不會有關於圖像的生存時間的麻煩,因爲它將被複制而不是被引用傳遞。

+0

所以它被改變爲在qt內傳遞值?並且沒有必要爲「圖像」添加任何互斥體? – Nyaruko 2015-02-08 14:41:31

+1

是的,它會被複制。不需要互斥體。 – Nejat 2015-02-08 15:50:07

+0

雖然副本確實發送,但此處提供的說明是錯誤的。 1)隊列連接總是複製參數。無論它們是通過值還是通過(const)引用傳遞都沒關係。 2)規範化簽名與此無關。 – peppe 2015-02-08 19:02:30

相關問題