Изменить сходство объекта с QThread на основной поток GUI - PullRequest
0 голосов
/ 17 мая 2018

У меня есть приложение Qt GUI, которое содержит несколько классов и основной.Для одной из сложных вычислительных операций я создал QThread в качестве члена класса.Примерно так:

//class members
std::unique_ptr<QThread> m_savingThread;
std::unique_ptr<DiffClass> m_controller;

connect(this, &SomeClass::saveAll, m_controller.get(), &DiffClass::saveToAll, Qt::QueuedConnection);    
connect(m_controller.get(), &DiffClass::done, m_savingThread.get(), &QThread::quit);

void SomeClass::saveToFile()
{
    //Saving thread
    qDebug() << "From main thread:" << QThread::currentThreadId();

    m_controller->moveToThread(m_savingThread.get());
    m_savingThread->start();

    qRegisterMetaType<std::string>("std::string");
    emit saveAll(someString);
 }

Приведенный выше код работает нормально.Но мне нужно, чтобы объект m_controller вернулся в основной поток графического интерфейса после завершения операции сохранения.Я мог найти что-то подобное здесь .Вкратце, в нем говорится, что, поскольку QThread может только «протолкнуть» объект в поток, мне необходимо снова вставить его в основной поток из текущего рабочего потока.

void DiffClass::saveToAll(someString)
{
    qDebug() << "From worker thread:" << QThread::currentThreadId();
    /*saving operation*/
    moveToThread(QApplication::instance()->thread()); //Error QCoreApplication has no member thread()
    emit done();
}

Есть ли способизменить сродство объекта обратно к основному потоку?

РЕДАКТИРОВАТЬ 1: От * connect до saveToAll - это QueuedConnection.

1 Ответ

0 голосов
/ 17 мая 2018

Прежде всего, почему вы хотите переключать родство потоков назад и вперед? Кажется, в этом нет практической стороны.

Кроме этого, должна быть возможность изменить его на другую угрозу, условие состоит в том, что у объекта нет родителя, и moveToThread() вызывается из текущего потока сродства.

Вы можете использовать QMetaObject::invokeMethod() с Qt::QueuedConnection, указанным в любом потоке, чтобы запланировать выполнение слота из текущего потока сродства, который изменит сродство с правого потока на любой поток, который вы передадите в качестве параметра.

Но если посмотреть, как вы пытаетесь изменить его изнутри класса, это должно сработать так, как ожидается, если saveToAll() вызывается через механизм сигнал / слот (а не напрямую из какого-либо потока).

//Error QCoreApplication has no member thread()

Это, безусловно, соответствует документации.

...