Семантика перемещения в QObject::moveToThread

В документации класса QThread одна примерная установка работает так:

public:
Controller() {
    Worker *worker = new Worker;
    worker->moveToThread(&workerThread);
    //some connects to thread and worker
    workerThread.start();
}
~Controller() {
    workerThread.quit();
    workerThread.wait();
}

Qt реализует фактическую семантику перемещения с moveToThread(...) функционировать здесь? Т.е. поток позаботится об отмене выделения объекта Worker после его завершения, так как Worker* выделено в Controller() никогда нигде не удаляется явно?

3 ответа

Решение

moveToThread не будет передавать право собственности.

В связанном примере эта строка убедится, что рабочий удален после завершения потока:

connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);

Кажется, что QThreadPool будет лучше соответствовать примеру, который вы приводите. Как объяснено в документе:

Worker *worker = new Worker();
// QThreadPool takes ownership and deletes 'worker' automatically
QThreadPool::globalInstance()->start(worker);

Ваш Worker класс должен наследовать от QRunnable и реализовать виртуальную функцию run().

Qt реализует фактическую семантику перемещения с помощью функции moveToThread(...) здесь? Т.е. поток позаботится об отмене выделения объекта Worker после его завершения, поскольку Worker*, выделенный в Controller(), никогда нигде не удаляется явно?

Какие moveToThread означает, что слоты myObject будет выполняться в контексте EventLop этого QThread:

Из документации Qt:

По умолчанию run() запускает цикл обработки событий, вызывая exec() и запускает цикл обработки событий Qt внутри потока.

Что касается владения, то в этом контексте moveToThread не имеет ничего общего с владением с точки зрения управления памятью, а скорее с владением с точки зрения потоков, исполняющих слоты. По умолчанию все слоты выполняются в основном цикле событий Qt. Чтобы переместить это в поток, позвоните moveToThread...

Другие вопросы по тегам