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