gpt4 book ai didi

c++ - QObject::setParent: 无法设置父对象,新的父对象在不同的​​线程中

转载 作者:行者123 更新时间:2023-11-30 01:11:34 27 4
gpt4 key购买 nike

问候语

我有一个后续类(class)。

class MyClass : public QObject
{
Q_OBJECT

public:
Q_INVOKABLE QVariant status();

public:
MyClass(ClassX * classX);

public slots:
void slotA();
void slotB();

signals:
void signalA();
void signalB();

private:
void init();
void doSomething();

private:
ClassX * classX;
ClassA classA;
ClassB classB;
};

MyClass 的构造函数中,我将 classX 设置为 this.classX 并在 init() 中,我 connect 一些 classX 信号到 MyClass 插槽,反之亦然,在 someFunction() 中我使用 classAclassB

在主线程的 controller 类中,我创建了 MyClass 对象并在不同的线程中运行它。

MyClass * myClass = new MyClass(classX);
connect(&myClassThread, SIGNAL(started()), myClass, SLOT(init()));
myClass->moveToThread(&myClassThread);
myClassThread.start();

我在 qDebugger 中看到以下警告。

QObject::setParent: Cannot set parent, new parent is in a different thread

谁能告诉我为什么会收到该警告?

提前致谢

PS 1: classX 在主线程中创建。

PS 2:记住,一切正常,我没有任何问题,我只是想知道这个警告的原因以及如何解决它。

PS 3:我还在主线程中使用以下命令在 javascript 中公开对象。

webFrame->addToJavaScriptWindowObject("myClassObject", myClass);

编辑 1:QThread myClassThread 是类成员。

编辑 2:我相信缺乏信息,让你们感到困惑,对此我深表歉意。

MyClass 的构造函数是这样的:

MyClass::MyClass(ClassX * classX)
{
this.classX = classX;
}

最佳答案

让我们说清楚。 您的代码未按预期运行。这就是框架告诉您的信息。

QObject::setParent: Cannot set parent, new parent is in a different thread

这意味着某个对象(疑似myClass)的所有槽和信号都不会像预期的那样在同一个线程中执行。这里的问题围绕着 myClassclassX 对象的父对象

可能性 I : myClass->moveToThread(&myClassThread);正在失败

原因: myClass 已经设置了父类。这是被禁止的。

表示init()会被线程对象myClassThread的线程触发。线程和事件方面,这几乎和你做的一样

MyClass * myClass = new MyClass(classX);
QMetaObject::invokeMethod(myClass, "init", Qt::QueuedConnection);

可能性 II:init() 违反了线程关联

原因: `classX`` 或一个神秘的相关对象已经设置了父对象,或者不能移动到另一个线程。想想小部件。

moveToThread 成功,您在一个线程中有 MyClass,在另一个线程中有 classX。您在构造 myClass 时提供了 classXmyClass 现在正在另一个线程中操作一个对象,如果没有进一步的代码,我们就不能假设线程安全或正确的子父关联。仔细检查 MyClass::MyClass` 和 MyClass::init。

发生了哪一个?

尝试在调试器、 Controller 代码中打断并查看线程 ID。然后在 init 方法中中断调试器。

  • 如果是同一个线程,case I
  • 否则为情况II

关于c++ - QObject::setParent: 无法设置父对象,新的父对象在不同的​​线程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35868750/

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