簡體   English   中英

如何知道Qt在哪個線程中執行插槽?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM