Qt moveToThread работает только в первый раз - PullRequest
0 голосов
/ 06 марта 2019

Я создаю приложение, выполняющее задачу бесконечности, поэтому я решил управлять им с помощью QThread. При определенных условиях этот поток должен порождать временный терад для выполнения некоторых вычислений. Проблема в том, что это работает только в первый раз, а во второй раз я получаю эту ошибку:

QObject::moveToThread: Current thread (0xd29078) is not the object's thread (0x6e000df0).
Cannot move to target thread (0x6e002c68)

В основном я инициализировал класс и переместил его в QThread.

AccelerometerBuffer accBuffer;
QThread *accelerometerThread = new QThread;
accelerometerThread->setObjectName("AccelerometerThread");
accelerometerThread->setParent(&accBuffer);
accBuffer.moveToThread(accelerometerThread);
QObject::connect(accelerometerThread,SIGNAL(started()),&accBuffer,SLOT(readAccelerationData()));
QObject::connect(accelerometerThread,SIGNAL(finished()),accelerometerThread,SLOT(deleteLater()));
accelerometerThread->start();

В readAccelerationData после условия я должен вызвать еще один SLOT (saveData ()) в классе AccelerometerBuffer, поэтому временный поток должен быть создан accelerometerThread.

if(condition){
    QThread* thread = new QThread;
    QThread::currentThread()->moveToThread(thread);
    connect(thread,SIGNAL(started()),QThread::currentThread()->parent(),SLOT(saveData()));
    connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
    thread->start();
}

При первом возникновении условия все работает нормально, saveData выполняется правильно. В следующий раз я получаю сообщение об ошибке и не понимаю причину.

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете только moveToThread из собственной ветки.Как только вы перейдете в другой поток, тот же вызов больше не сможет ничего делать.

С https://doc.qt.io/qt-5/qobject.html#moveToThread

Предупреждение: эта функция не является поточно-ориентированной;текущий поток должен совпадать с текущим сродством потока.Другими словами, эта функция может только «вытолкнуть» объект из текущего потока в другой поток, она не может «вытянуть» объект из любого произвольного потока в текущий поток.

...