QObject: Cannot create children for a parent that is in a different thread. (Parent is IEC104Master(0x3258a00), parent's thread is QThread(0x243c4009f0)), current thread is MyThread(0x3258 xiancheng id 0x7fd2117fa700
时间: 2023-07-28 15:36:59 浏览: 163
QSerialport多线程方法
这个错误通常是因为你在不同的线程中尝试创建或访问 QObject 对象。在 Qt 中,每个 QObject 对象都必须属于一个线程,而且其父对象的线程必须与其自身的线程相同。
在你的代码中,IEC104Master 对象是在一个线程中创建的,而 MyThread 是在另一个线程中创建的。当你在 MyThread 中创建一个 QObject 对象并将其作为 IEC104Master 的子对象时,就会出现这个错误。
为了解决这个问题,你需要确保在同一个线程中创建和访问 QObject 对象。你可以使用 QObject::moveToThread() 方法将 QObject 对象移动到另一个线程中,或者使用信号和槽机制在不同线程之间进行通信。
下面是一个使用信号和槽的示例代码:
```cpp
// 在 IEC104Master 的构造函数中连接信号和槽
IEC104Master::IEC104Master() {
// 在 IEC104Master 所在线程中创建 QObject 对象
m_workerObject = new QObject;
// 将 m_workerObject 移动到 MyThread 线程中
m_workerObject->moveToThread(&m_thread);
// 连接信号和槽
connect(this, &IEC104Master::dataReady, m_workerObject, &QObject::deleteLater);
connect(this, &IEC104Master::dataReady, this, &IEC104Master::handleData);
}
// 在 handleData() 方法中触发信号
void IEC104Master::handleData() {
// 处理数据...
// 触发信号
emit dataReady();
}
```
在上面的代码中,我们在 IEC104Master 的构造函数中创建了一个 QObject 对象 m_workerObject,并将其移动到了 MyThread 线程中。然后,我们连接了 dataReady() 信号到 m_workerObject 的 deleteLater() 槽函数,以确保在 m_workerObject 所在线程中销毁它。我们还连接了 dataReady() 信号到 IEC104Master 的 handleData() 槽函数,以处理数据并触发信号。这样,我们就可以在不同线程之间进行通信,避免了出现 QObject: Cannot create children for a parent that is in a different thread 的错误。
阅读全文