gpt4 book ai didi

c++ - 调用 QObject 的函数移动到 Qt 中的不同线程?

转载 作者:行者123 更新时间:2023-11-30 02:50:02 25 4
gpt4 key购买 nike

虽然我对 QObjectQThread 以及如何在 Qt 中进行多线程有相当多的了解,但我在理解某些场景时遇到了困难。考虑一个被移动到另一个 QThreadclass Myclass : QObject

class MyClass : QObject
{
public slots:
void slot1();
bool slot2();
void slot3();
}

我有课

class Window
{
signals:
void sig1();
bool sig2();

private:
MyClass *myObj;

public:
void func()
{
connect(this, SIGNAL(sig1()), myObj, SLOT(slot1()), Qt::DirectConnection);
emit sig1();
qDebug("SIGNAL1 emitted!");

connect(this, SIGNAL(sig2(bool)), myObj, SLOT(slot2(bool)));
bool result = emit sig2();

myObj->slot3();
}

}
  1. 当发出 sig1 时,我了解到 qDebug() 只会在 slot1() 执行后执行。但是slot1是在Window线程中执行还是在MyClass线程中执行呢?

  2. sig2 的情况下,是否保证 result 将存储 slot2 返回的值,或者此连接是否有必要直接吗?

  3. 如图所示运行slot3是否正确? slot3 修改 myObj 的类变量,并发出一个 SIGNAL 连接到调用的 SLOT 窗口对象。如果正确那么Window的槽什么时候执行,在哪个线程执行?

最佳答案

When sig1 is emitted I understand that the qDebug() will be executed only after slot1() is executed.

默认不保证。每当 Qt 事件循环回调它时,槽将被调用,可以是在函数或方法之前,也可以是在 connect 语句之后。如果您为最后一个参数 Qt::ConnectionType 指定直接连接,那么将保证立即调用。有关详细信息,请参阅文档:

Qt::DirectConnection 1 The slot is invoked immediately, when the signal is emitted.

但是,如果您没有明确指定,Qt::AutoConnection 是默认的。

But is slot1 executed in Window thread or MyClass thread?

这又取决于连接类型参数。查看documentation了解详情。

简而言之,如果它在队列中,则在接收者的线程中执行,否则从与接收者不同的线程中执行。

In case of sig2 is it guaranteed that result will store value returned by slot2 or is it necessary for this connection to be direct?

这看起来不对。应该避免的信号,您不能将它们的返回值存储为函数或方法返回值,并期望它是连接插槽的结果。

即使可以,也会造成混淆,因为不止一个插槽可以连接到同一信号。更重要的是,信号可以连接到信号。

Is it correct to run slot3 as shown? slot3 modifies class variables of myObj as well as it emits a SIGNAL which is connected to a SLOT of the calling Window object. If it is correct then when will the slot of Window be executed and in which thread?

是的,您可以这样调用它,因为槽只是常规函数,通常具有 void 返回值类型。

关于c++ - 调用 QObject 的函数移动到 Qt 中的不同线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20774287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com