C ++ Qt - 调用插槽时,该函数是不是称为新线程?

Posted

技术标签:

【中文标题】C ++ Qt - 调用插槽时,该函数是不是称为新线程?【英文标题】:C++ Qt - When a slot is called, is the function called a new thread?C ++ Qt - 调用插槽时,该函数是否称为新线程? 【发布时间】:2012-08-20 05:53:43 【问题描述】:

我想知道当我点击my_button时函数do_something()是否被视为一个新线程。

connect(my_button, SIGNAL(clicked), this, SLOT(do_something));

【问题讨论】:

【参考方案1】:

典型的信号/插槽行为是根据connection type 确定的。未指定时,默认为Qt::AutoConnection,如果无法建立直接连接,将使用接收者的线程。

来自文档:

当控制返回到接收者线程的事件循环时调用该槽。该槽在接收者的线程中执行。

您可以在连接时更改connection type 以改变行为:

connect(my_button, SIGNAL(clicked), this, SLOT(do_something),
    Qt::QueuedConnection); // always queue

由于您谈论的是一个发出信号的按钮,默认连接类型Qt::AutoConnection 意味着建立了直接连接,并且do_something 插槽将立即执行,就好像它被直接调用一样单击按钮的点。

【讨论】:

我不知道 Qt 管理的连接类型。我正在阅读文档,但有些不清楚:“(默认)如果信号是从与接收对象不同的线程发出的。”你能定义“来自不同的线程”吗?更具体地说,我知道多线程的工作原理和方式。我不知道 Qt 是如何管理它的东西的,我猜有一个隐藏的线程系统。 @Bibi541:没有隐藏线程,但是如果您创建自己的 QThread,它们可以有自己的事件循环,并且分配/创建给这些线程的 QObjects 将在其线程上调用自动连接槽,而不是发射对象的线程(通常是 QButtons 等的 main/ui 循环......) 一些注意事项:方向连接只是一个函数调用,其间有一些连接查找并且完全同步。排队的连接(没有有意识地将对象移动到不同的线程中)在事件循环中安排调用,但这仍然是单线程的。 总而言之,一个槽永远不会在新线程中被调用。即使接收者的线程与发送者的线程不同,这也只能是因为自己创建了那个线程并在那个线程中创建了接收对象。 Qt 不会在后台创建任何新线程。

以上是关于C ++ Qt - 调用插槽时,该函数是不是称为新线程?的主要内容,如果未能解决你的问题,请参考以下文章

从 JavaScript 调用 Qt 插槽

QT - >如果线程正在消耗所有资源并且不允许插槽执行,如何杀死线程

Qt Connect 无法连接到插槽

未调用 Qt 信号槽

Qt 插槽未被调用

Qt - 仅在发出两个信号时才调用插槽