如何知道Qt在哪个线程执行插槽?

时间:2016-05-05 17:46:32

标签: c++ multithreading qt

我使用Qt,我需要在主线程中执行一些代码。我意识到成功使用信号和放大器槽。

我的问题是,即使它正在工作:什么定义了哪个线程执行一个插槽作为信号发出的直接结果?

是在执行connect()函数的线程内部还是什么?

2 个答案:

答案 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));
}

直接连接不需要使用事件循环,就像通过函数指针调用任何间接函数一样。