QObject::setParent:无法设置父级,新的父级位于不同的线程中
QObject::setParent: Cannot set parent, new parent is in a different thread
问候语
我有以下课程。
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()
中,我将classX
一些信号connect
到MyClass
插槽,反之亦然,someFunction()
我使用 classA
和 classB
。
在主线程的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:无法设置父级,新父级位于不同的父级中 线
这意味着某个对象(疑似myClass
)的所有插槽和信号将不会在与预期相同的线程中执行。这里的问题围绕着myClass
或classX
对象的父对象
可能性 I : myClass->moveToThread(&myClassThread); 失败
原因: myClass 已经设置了父级。 这是禁止的。
这意味着init()
将由线程对象myClassThread
的线程触发。线程和事件方面,这几乎与您所做的相同
MyClass * myClass = new MyClass(classX);
QMetaObject::invokeMethod(myClass, "init", Qt::QueuedConnection);
可能性二:init() 违反了线程亲和性
原因:"classX"或一个神秘的相关对象已经设置了父对象,或者无法移动到另一个线程。想想小部件。
moveToThread
成功,您必须在一个线程中MyClass
,在另一个线程中classX
。您在构造myClass
时提供了classX
。 myClass
现在正在另一个线程中操作一个对象,如果没有进一步的代码,我们就无法假设线程安全或正确的子父亲和性。仔细查看MyClass
::MyClass' 和 MyClass::init。
哪一个正在发生?
尝试在调试器、控制器代码中放置一个中断,并查看线程 ID。然后在 init
方法的调试器中放置一个中断。
- 如果是同一线程,则情况 I
- 否则就是案例二
在很多方面都是错误的:
QThread myClassThread;
MyClass * myClass = new MyClass(classX);
connect(&myClassThread, SIGNAL(started()), myClass, SLOT(init()));
myClass->moveToThread(&myClassThread);
myClassThread.start();
- 您是在堆栈上而不是在堆上创建线程对象!这意味着当此代码块结束时
myClassThread
对象将被销毁。 -
myClass
有一个父母。移动到线程的对象不能有任何父对象。只能将整整三个对象移动到线程
- 从不同线程使用int64的不同字节安全吗
- C++在不同线程中改变向量
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 在C++中写入来自不同线程的文件
- C++boost,等待来自不同线程的varinit
- 不同线程之间的互斥锁同步
- 将字符串指针传递到C++和Xcode 11.1中不同线程上运行的函数
- 如何将用户输入从控制台传递到不同线程中的对象 -> QTcpsocket
- 如何调用来自不同线程的回调?
- 对象:无法为位于不同线程中的父线程创建子级
- Qt-使用信号和具有不同线程的插槽
- QT 4.8,如何从不同线程发送信号
- C++ 11 您可以通过不同线程中的引用安全地传递和访问 std::atomics 吗?
- 使用来自不同线程的OpenGL命令
- 如果不同的线程调用另一个不同线程的相同信号,则需要静音
- 构造函数在不同线程中的静态单例类上调用两次
- 避免在不同线程中执行期货时破坏对象
- 如何同时启动两个具有不同线程函数的线程团队
- C++ 有关在不同线程中运行io_context的编译错误