[英]How to know in which thread Qt executes slots?
我使用Qt,並且需要在主線程中執行一些代碼。 我意識到成功使用信號和插槽。
我的問題是,甚至在atm上都起作用:是什么定義了在哪個線程中將插槽作為信號發射的直接結果執行?
它是在執行connect()函數的線程內嗎?
這取決於您如何建立connection
。
如果使用Qt::DirectConnection
,則將在信令線程中立即執行該插槽,從而繞過任何事件循環。
如果您使用Qt::QueuedConnection
,它將在接收對象線程的接收對象事件循環中執行。
如果未指定連接類型,則默認為Qt::AutoConnection
,如果兩個QObjects
具有不同的線程親和力,則默認為Qt::QueuedConnection
。
直接連接的插槽始終在信號返回之前立即執行。
通過隊列連接連接的插槽將在其對象的thread()
運行的事件循環中執行。 該插槽是從exec()
內部調用的。
默認的自動連接確定每次發射信號時使用哪種方法。 如果目標對象在同一線程中,則將立即從信號中調用該插槽,否則將事件發布到目標對象,由目標線程的事件循環拾取並在該線程中執行。
邏輯有效地是:
void mySignal(params) {
// moc-generated code below
for (all directly connected slots, all automatically connected slots in this thread):
slot(params);
for (all queued-connected slots):
QCoreApplication::postEvent(slot's object, new QMetaCallEvent(slot, params));
}
直接連接不需要事件循環即可工作,就像通過函數指針進行的任何間接函數調用一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.