繁体   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