Qt 多執行緒中地訊號與槽

2021-09-28 14:04:30 字數 1780 閱讀 5703

qt 多執行緒中地訊號與槽

函式原型:

1 qobject:

:connect

(const qobject *sender,

const char *signal,

const qobject *receiver,

const char *method, qt:

:connectiontype type = qt:

:autoconnection)

enum qt::connectiontype

此列舉描述可以在訊號和插槽之間使用的連線型別。特別地,它確定特定的訊號是立即傳遞到乙個插槽,還是排隊等待稍後的傳遞。

通常使用的connect,實際上最後乙個引數使用的是qt::autoconnection型別。

constant(value)

description

qt::autoconnection(0)

(預設)如果接收者位於發出訊號的執行緒中,則使用qt::directconnection。否則,使用qt::queuedconnection。連線型別在訊號發出時確定。

qt::directconnection(1)

當訊號發出時,插槽立即被呼叫。插槽在傳送訊號的執行緒中執行。

qt::queuedconnection(2)

當控制返回到接收者執行緒的事件迴圈時呼叫插槽。插槽在接收執行緒中執行。

qt::blockingqueuedconnection(3)

與qt::queuedconnection相同,只是發出訊號的執行緒阻塞,直到插槽返回。如果接收者位於傳送訊號的執行緒中,則不能使用此連線,否則應用程式將死鎖。

qt::uniqueconnection(0x80)

這是乙個可以與上述任何一種連線型別組合使用的標誌,使用的是按位或。當qt::uniqueconnection被設定時,如果連線已經存在,qobject::connect()將會失敗(也就是說,如果相同的訊號已經被連線到同一對物件的同乙個槽中)。這個標誌是在qt 4.6中引入的。

在多執行緒中發出乙個訊號,沒被子執行緒接收到,原因就是預設連線方式為qt::autoconnection,在多執行緒中又為qt::queuedconnection,對於排隊連線,引數必須是qt的元物件系統所知道的型別,因為qt需要複製引數以將它們儲存在後台事件中。如果你嘗試使用排隊連線,並得到錯誤訊息。

解決辦法有兩種:

1 #include 

//記得包含這個標頭檔案

2//my_type是我自己定義的型別

3 qregistermetatype

("my_type");

4connect

(xx,

signal(xx

(my_type)

),xx,

slot(xx

(my_type)))

;

在connect函式的第五個引數加入qt::directconnection

1

connect

(xx,

signal(xx

(my_type)

),xx,

slot(xx

(my_type)),

connect

(xx,

signal(xx

(my_type)

),xx,

slot(xx

(my_type)))

;);

qt 多執行緒 訊號槽

qt訊號多執行緒 當你connect的時候,型別為qt autoconnection就好了 如果slot在同一執行緒就是直接呼叫,如果slot在另外乙個執行緒就通過事件機制處理 在qt中,你的執行緒在呼叫exec函式後就進入了事件迴圈機制 這時,如果另外乙個執行緒傳送了乙個訊號過來 1 如果接收執行...

QT 多執行緒訊號與槽(一)

1.乙個主介面 主線程 乙個次執行緒,次執行緒通過訊號向主線程傳遞遞增變數,主線程將它顯示出來 mythread.h include include class mythread public qthread mythread.cpp include mythread.h include mythr...

QT 多執行緒訊號與槽(二)

乙個主線程,乙個次執行緒,主線程向次執行緒傳送訊號 mythread.h include include class mythread public qthread mythread.cpp include mythread.h include mythread mythread void myth...