Название: Верно ли? Отправлено: OKTA от Октябрь 13, 2014, 11:53 Товарищи, верно ли следующее?
Есть объект, сидящий в потоке (через movToThread). Как только объект подхватил deleteLater, потоку даются команды quit и wait. Соответственно, пока есть события в очереди событий потока, он не завершится, точнее не завершится, пока объект сидящий в нем не уничтожится. Верно ли? Название: Re: Верно ли? Отправлено: Igors от Октябрь 13, 2014, 13:07 Товарищи, верно ли следующее? А что значит "подхватил"? Если событие deleteLater обрабатывается - объект удаляется. При этом из очереди вычеркиваются все посланные ему события. Есть объект, сидящий в потоке (через movToThread). Как только объект подхватил deleteLater, потоку даются команды quit и wait. Соответственно, пока есть события в очереди событий потока, он не завершится, точнее не завершится, пока объект сидящий в нем не уничтожится. Верно ли? Второе верно, первое нет. Удаление и обработка в одной нитке, значит обработка выполнится после удаления. Но когда дело дойдет до обработки - извлечения след события не произойдет, т.к. Вы сделали quit. Нитка покинет цикл событий. Ну а wait надо делать "извне", не в самой же ниткеНазвание: Re: Верно ли? Отправлено: OKTA от Октябрь 13, 2014, 14:14 Подхватил, всмысле начал удаляться))
А вычеркиваются ли? Не ожидает ли просто, пока все эти события обработаются? Название: Re: Верно ли? Отправлено: Igors от Октябрь 13, 2014, 15:03 Подхватил, всмысле начал удаляться)) Вычеркиваются, когда-то копался в исходниках. Был вопрос типа безопасно ли 2 deleteLater дважды - да, безопасноА вычеркиваются ли? Не ожидает ли просто, пока все эти события обработаются? Название: Re: Верно ли? Отправлено: OKTA от Октябрь 13, 2014, 22:01 Ничего не понял)
в итоге вопрос выливается в следующее. Как правильнее уничтожать объект в потоке с последующим завершением потока. Грубо говоря или так Код
Или дождаться уничтожения объекта и потом завершать поток? Название: Re: Верно ли? Отправлено: Igors от Октябрь 14, 2014, 09:05 Грубо говоря или так Нормально удалится, QThread::finish позовет все события DeferredDelete. Но если надо "просто удалить" можно сделать это после завершения, напрКод
Код Чем меньше deleteLater - тем лучше Название: Re: Верно ли? Отправлено: OKTA от Октябрь 14, 2014, 09:44 Но к сожалению без него никак, если у объекта осталось порядочно событий в очереди, которые обязательно надо обработать для безаварийного завершения.
Спасибо за разъяснения, Igors! Название: Re: Верно ли? Отправлено: Akon от Октябрь 14, 2014, 09:55 Цитировать Вычеркиваются, когда-то копался в исходниках. Был вопрос типа безопасно ли 2 deleteLater дважды - да, безопасно Тоже для таймеров: если удаляем таймер, а в очереди есть для него события - то тоже безопасноЕсли время жизни объекта не превышает время жизни потока, то такой объект вообще лучше делать локальным (т.е. создавать в функции потока). Название: Re: Верно ли? Отправлено: OKTA от Октябрь 14, 2014, 10:02 Это в случае наследования от QThread?
Название: Re: Верно ли? Отправлено: Akon от Октябрь 14, 2014, 10:19 Нет, это локальный объект в QThread::exec.
имхо, от QThread вообще лучше не наследоваться т.о., чтобы он торчал наружу. Единственное, через наследование перекрывается QThread::exec(), и то, если бы сделали входной функтор, то и это было бы не нужно. QThread превратился бы в финитный класс - красота. Название: Re: Верно ли? Отправлено: OKTA от Октябрь 14, 2014, 10:23 локальный объект в exec? А это как? Что-то я не догоняю ;D
Название: Re: Верно ли? Отправлено: Akon от Октябрь 14, 2014, 11:13 Вот так, например. app - локальный (стековый) объект.
Код: int main(int argc, char *argv[]) Название: Re: Верно ли? Отправлено: OKTA от Октябрь 14, 2014, 11:14 А не в главном потоке? :)
Название: Re: Верно ли? Отправлено: Akon от Октябрь 14, 2014, 11:26 да, в вашем QThread::exec()
Название: Re: Верно ли? Отправлено: OKTA от Октябрь 14, 2014, 11:45 Спасибо! ;)
|