К каким объектам можно применять moveToThread

139
23 февраля 2019, 07:30

Допустимо ли применять moveToThread к объекту, созданному на стеке? Например, так:

QThread *thread_ptr = new QThread;
MyClass obj;
obj.moveToThread(thread_ptr);
// (&obj)->moveToThread(thread_ptr);

Не возникнет ли тут проблема, связанная с тем, что локальный объект расположен в памяти, которую в общем-то переместить невозможно, а также она будет очищена при выходе из области видимости? Или же moveToThread произведёт глубокое копирование объекта в память указанного потока?

Answer 1

moveToThread ничего никуда не перемещает, вопреки своему имени. Он устанавливает ассоциированный с объектом поток. Т.е. устанавливает поток, который будет обрабатывать все слоты, которые должны быть вызваны для этого объекта в случае QueuedConnection. Совершенно не важно где создан Ваш объект, на стеке или в куче. Перемещение его в другой поток с этим никак не связано.

Answer 2

С большой вероятностью получите проблему. Никто не будет копировать за Вас. Поэтому, обычно в Qt все передают по указателю (или умному, но это реже) и почти всегда создают в динамической памяти.

Почему же "с большой вероятностью"? может так повезти, что объект будет как то жив/доступен, когда к нему обратятся.

READ ALSO
Узнать индекс элемента контейнера

Узнать индекс элемента контейнера

Хочу написать параллельный for_each, но внутри мне нужно знать индекс текущего обрабатываемого элементаКак его узнать без data race?

173
QLayout не изменяет размеры виджета

QLayout не изменяет размеры виджета

При изменении размеров родительского окна, меняется размер только у одного виджетаНеобходимо, чтобы они изменялись одновременно

156
Не запускается Debug при использовании QCameraViewfinder

Не запускается Debug при использовании QCameraViewfinder

Господа! Хочу обратить ваше внимание на следующюю проблемуЕсть небольшой код:

166
использование контейнера map

использование контейнера map

как я могу реализовать такую конструкцию ?

152