我使用Qt,我需要在主线程中执行一些代码。我意识到成功使用信号和放大器槽。
我的问题是,即使它正在工作:什么定义了哪个线程执行一个插槽作为信号发出的直接结果?
是在执行connect()函数的线程内部还是什么?
答案 0 :(得分:3)
这取决于您设置connection
的方式。
如果使用Qt::DirectConnection
,则会立即在信令线程中执行插槽,绕过任何事件循环。
如果您使用Qt::QueuedConnection
,它将在接收对象事件循环中,在接收对象线程中执行。
如果您未指定连接类型,则默认为Qt::AutoConnection
,如果两个Qt::QueuedConnection
具有不同的线程关联,则默认为QObjects
。
答案 1 :(得分:1)
直接连接的插槽始终在信号返回之前立即执行。
通过排队连接连接的插槽将在其对象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));
}
直接连接不需要使用事件循环,就像通过函数指针调用任何间接函数一样。