Семантика перемещения в 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() никогда нигде не удаляется явно?

0

Решение

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

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

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

Другие решения

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

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

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

1

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

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

От Документация Qt:

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

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

0
По вопросам рекламы [email protected]