В документации Класс 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()
никогда нигде не удаляется явно?
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 (…)
функционировать здесь? То есть заботится ли поток о выделении
Рабочий объект после его завершения, так как Рабочий * выделяется в
Controller () никогда нигде не удаляется явно?
Какие moveToThread
означает, что слоты myObject
будет выполняться в контексте EventLop этого QThread:
От Документация Qt:
По умолчанию run () запускает цикл обработки событий, вызывая exec () и запускает
Цикл событий Qt внутри потока.
Что касается владения, то в этом контексте moveToThread не имеет ничего общего с владением с точки зрения управления памятью, а скорее с владением с точки зрения потоков, исполняющих слоты. По умолчанию все слоты выполняются в основном цикле событий Qt. Чтобы переместить это в поток, позвоните moveToThread
…