knuut
knuut

Reputation: 71

Programming with threads

I get every time the message: QObject::moveToThread: Cannot move objects with a parent

mainwindow.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);

Device.cpp:

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

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

    //do something

    emit checkCompleted();
}

Upvotes: 2

Views: 1484

Answers (1)

Jablonski
Jablonski

Reputation: 18504

this inside Device constructor means that Device has a parent and this parent in your case lives in main GUI thread, so Qt tells you that you can't move to another thread object which has parent. So try to use next:

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

Also you should start your thread with:

thread->start();

Also you need delete your object because it has no parent and it is your responsibility now. The most common way is to use some signal to indicate that worker already done all needed work. For example:

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

Upvotes: 4

Related Questions