Russian Qt Forum
Ноябрь 22, 2024, 23:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Верно ли?  (Прочитано 6540 раз)
OKTA
Гость
« : Октябрь 13, 2014, 11:53 »

Товарищи, верно ли следующее?
Есть объект, сидящий в потоке (через movToThread). Как только объект подхватил deleteLater, потоку даются команды quit и wait. Соответственно, пока есть события в очереди событий потока, он не завершится, точнее не завершится, пока объект сидящий в нем не уничтожится. Верно ли?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 13, 2014, 13:07 »

Товарищи, верно ли следующее?
Есть объект, сидящий в потоке (через movToThread). Как только объект подхватил deleteLater, потоку даются команды quit и wait.
А что значит "подхватил"? Если событие deleteLater обрабатывается - объект удаляется. При этом из очереди вычеркиваются все посланные ему события.

Соответственно, пока есть события в очереди событий потока, он не завершится, точнее не завершится, пока объект сидящий в нем не уничтожится. Верно ли?
Второе верно, первое нет. Удаление и обработка в одной нитке, значит обработка выполнится после удаления. Но когда дело дойдет до обработки - извлечения след события не произойдет, т.к. Вы сделали quit. Нитка покинет цикл событий. Ну а wait надо делать "извне", не в самой же нитке
Записан
OKTA
Гость
« Ответ #2 : Октябрь 13, 2014, 14:14 »

Подхватил, всмысле начал удаляться))
А вычеркиваются ли? Не ожидает ли просто, пока все эти события обработаются?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 13, 2014, 15:03 »

Подхватил, всмысле начал удаляться))
А вычеркиваются ли? Не ожидает ли просто, пока все эти события обработаются?
Вычеркиваются, когда-то копался в исходниках. Был вопрос типа безопасно ли 2 deleteLater дважды - да, безопасно
Записан
OKTA
Гость
« Ответ #4 : Октябрь 13, 2014, 22:01 »

Ничего не понял)
в итоге вопрос выливается в следующее. Как правильнее уничтожать объект в потоке с последующим завершением потока.
Грубо говоря или так
Код
C++ (Qt)
obj->deleteLater();
thread->quit();
thread->wait()

Или дождаться уничтожения объекта и потом завершать поток?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 14, 2014, 09:05 »

Грубо говоря или так
Код
C++ (Qt)
obj->deleteLater();
thread->quit();
thread->wait();
Нормально удалится, QThread::finish позовет все события DeferredDelete. Но если надо "просто удалить" можно сделать это после завершения, напр
Код
C++ (Qt)
QPointer <CObject> p(obj);
thread->quit();
thread->wait();
delete p;
 
Чем меньше deleteLater - тем лучше
Записан
OKTA
Гость
« Ответ #6 : Октябрь 14, 2014, 09:44 »

Но к сожалению без него никак, если у объекта осталось порядочно событий в очереди, которые обязательно надо обработать для безаварийного завершения.
Спасибо за разъяснения, Igors!
Записан
Akon
Гость
« Ответ #7 : Октябрь 14, 2014, 09:55 »

Цитировать
Вычеркиваются, когда-то копался в исходниках. Был вопрос типа безопасно ли 2 deleteLater дважды - да, безопасно
Тоже для таймеров: если удаляем таймер, а в очереди есть для него события - то тоже безопасно

Если время жизни объекта не превышает время жизни потока, то такой объект вообще лучше делать локальным (т.е. создавать в функции потока).
Записан
OKTA
Гость
« Ответ #8 : Октябрь 14, 2014, 10:02 »

Это в случае наследования от QThread?
Записан
Akon
Гость
« Ответ #9 : Октябрь 14, 2014, 10:19 »

Нет, это локальный объект в QThread::exec.

имхо, от QThread вообще лучше не наследоваться т.о., чтобы он торчал наружу. Единственное, через наследование перекрывается QThread::exec(), и то, если бы сделали входной функтор, то и это было бы не нужно. QThread превратился бы в финитный класс - красота.
Записан
OKTA
Гость
« Ответ #10 : Октябрь 14, 2014, 10:23 »

локальный объект в exec? А это как? Что-то я не догоняю  Смеющийся
Записан
Akon
Гость
« Ответ #11 : Октябрь 14, 2014, 11:13 »

Вот так, например. app - локальный (стековый) объект.
Код:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
...
Записан
OKTA
Гость
« Ответ #12 : Октябрь 14, 2014, 11:14 »

А не в главном потоке?  Улыбающийся
Записан
Akon
Гость
« Ответ #13 : Октябрь 14, 2014, 11:26 »

да, в вашем QThread::exec()
Записан
OKTA
Гость
« Ответ #14 : Октябрь 14, 2014, 11:45 »

Спасибо!  Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.101 секунд. Запросов: 23.