gpt4 book ai didi

c++ - 使用线程编程

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

我每次都会收到消息:QObject::moveToThread: Cannot move objects with a parent

主窗口.cpp:

QTimer *timer_ = new QTimer(this);
Device* device = new Device(this);
QThread* thread = new QThread(this);

device->moveToThread(thread);
connect(timer_, SIGNAL(timeout()), device, SLOT(checkConnection()));
connect(device, SIGNAL(checkCompleted()), this, SLOT(doSomethingWhenItIsDone()));
timer_->start(3000);

设备.cpp:

Device::Device(QObject *parent) :
QObject(parent)
{
}
void Device::checkConnection() {

qDebug() << "checkConnection:" << QThread::currentThreadId();

//do something

emit checkCompleted();
}

最佳答案

this inside Device constructor 意味着 Device 有一个父对象,在你的例子中这个父对象存在于主 GUI 线程中,所以 Qt 告诉你你不能移动到另一个有父对象的线程对象。所以接下来尝试使用:

QTimer *timer_ = new QTimer(this);
Device* device = new Device;//no parent
QThread* thread = new QThread(this);

此外,您应该以以下方式开始您的主题:

thread->start();

您还需要删除您的对象,因为它没有父对象,现在是您的责任。最常见的方法是使用一些信号来指示工作人员已经完成了所有需要的工作。例如:

connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));

关于c++ - 使用线程编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27839114/

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