qthread目前使用的兩個方式

2021-10-18 04:32:26 字數 1281 閱讀 5370

內容參考:

前言:在乙個使用多執行緒的專案中,使用訊號槽,想知道槽函式的響應時間,又懶得查文件,於是寫了一段**測試;

測試結果:預設情況下,槽函式是立即執行的,run()中的sleep(::sleep)並不影響槽函式的立即執行,多個槽函式會順序執行(執行緒使用方式改變之後也是同樣的結論)

void deal()

uart_port3_upper::uart_port3_upper(qobject *parent):

qthread(parent)

void uart_port3_upper::run()

}void uart_port3_upper::slot_test()

然而,一直使用的qthread方式(方式一)引起困惑:槽函式的sleep會阻塞主介面的響應,一直以為槽函式是在新執行緒中執行的??? 從現象來說很顯然不是這樣

使用方式一:

1.子類化qthread

2.過載run函式,在run函式中使用while死迴圈

3.執行緒間使用訊號槽 

qobject::connect的三種連線方式:

a.自動連線 (預設設定;如果訊號在接收者所依附的執行緒內發射,則等同於直接連線;如果發射訊號的執行緒喝接收者所依附的執行緒不同,則等同於佇列連線)

b.直接連線(當訊號發射時,槽函式將直接被呼叫;無論槽函式所屬的物件在哪個執行緒,槽函式都在發射訊號的執行緒內執行)

c.佇列連線(當控制權回到接收者所依附執行緒的事件迴圈時,槽函式被呼叫;槽函式在接收者所依附的執行緒執行)

那麼槽函式究竟是在**執行呢?

qthread是用來管理執行緒的,它所依附的執行緒和它管理的執行緒不是乙個執行緒;qthread所依附的執行緒就是初始化時所在的執行緒;qthread管理的執行緒是run啟動的執行緒,也就是次級執行緒。

int main(int argc, char *ar**)

在執行movetothread之後,upper所依附的執行緒為bs執行緒 ;upper與bs都是執行緒,upper的run()位於upper thread;upper的槽函式依附於bs,所以執行緒為bs的執行緒。有以下列印資訊

test1 thread: 2971974464(test1就是bs,在qthread的run中新增了執行緒列印,懶得改了)

upper thread: 2963581760

main thread: 3060403392

upper slot thread: 2971974464

SharePoint 禁用本地回環的兩個方法

有兩種方法中,若要變通解決此問題,請根據您的具體情況使用下列方法之一。設定disablestrictnamechecking 為 1 的登錄檔項。281308 連線到 smb 共享一台基於 windows 2000 的計算機或基於 windows server 2003 的計算機上可能無法使用別名 ...

兩個list集合取相同的元素》目前最佳效能

把2個相同list集合元素拿出來 目前最佳方法 listli1 new arraylist li1.add a li1.add b li1.add c li1.add d listli2 new arraylist li2.add c li2.add d li2.add e li2.add f 1....

使用Random的兩個誤區

隨機數的問題 c c c code for inti 0 i n i 這裡很明顯他是想輸出一串小於100的隨機的數列.可是執行結果輸出的卻是類似 97,97,97,97,97,30,30,30,30,30,30,30,30,30,30,30,30,27,27,27,27,27,27,的序列.很明顯這...