Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: OKTA от Октябрь 13, 2014, 11:53



Название: Верно ли?
Отправлено: OKTA от Октябрь 13, 2014, 11:53
Товарищи, верно ли следующее?
Есть объект, сидящий в потоке (через movToThread). Как только объект подхватил deleteLater, потоку даются команды quit и wait. Соответственно, пока есть события в очереди событий потока, он не завершится, точнее не завершится, пока объект сидящий в нем не уничтожится. Верно ли?


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

Соответственно, пока есть события в очереди событий потока, он не завершится, точнее не завершится, пока объект сидящий в нем не уничтожится. Верно ли?
Второе верно, первое нет. Удаление и обработка в одной нитке, значит обработка выполнится после удаления. Но когда дело дойдет до обработки - извлечения след события не произойдет, т.к. Вы сделали quit. Нитка покинет цикл событий. Ну а wait надо делать "извне", не в самой же нитке


Название: Re: Верно ли?
Отправлено: OKTA от Октябрь 13, 2014, 14:14
Подхватил, всмысле начал удаляться))
А вычеркиваются ли? Не ожидает ли просто, пока все эти события обработаются?


Название: Re: Верно ли?
Отправлено: Igors от Октябрь 13, 2014, 15:03
Подхватил, всмысле начал удаляться))
А вычеркиваются ли? Не ожидает ли просто, пока все эти события обработаются?
Вычеркиваются, когда-то копался в исходниках. Был вопрос типа безопасно ли 2 deleteLater дважды - да, безопасно


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

Или дождаться уничтожения объекта и потом завершать поток?


Название: Re: Верно ли?
Отправлено: Igors от Октябрь 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 - тем лучше


Название: 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[])
{
QApplication app(argc, argv);
...


Название: Re: Верно ли?
Отправлено: OKTA от Октябрь 14, 2014, 11:14
А не в главном потоке?  :)


Название: Re: Верно ли?
Отправлено: Akon от Октябрь 14, 2014, 11:26
да, в вашем QThread::exec()


Название: Re: Верно ли?
Отправлено: OKTA от Октябрь 14, 2014, 11:45
Спасибо!  ;)