|
|
|
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Есть поток, который нужно остановить. Это можно сделать функциями exit(), terminate(). В случае с exit() проверка isFinished() всегда даёт false, в случае terminate() выход функции isFinished() true. И, похоже, что exit() поток вообще не останавливает, так как при закрытии программы в окне <Вывод приложения> выводится «QThread: Destroyed while thread is still running». Может ошибаюсь.
Функция terminate() реализована в файлах qthread_win.cpp и qthread_unix.cpp. Для Android функция явно закрыта, вся её реализация под #if !defined(Q_OS_ANDROID). А что тогда делать с Android-ом? |
|||
|
||||
vinter |
|
|||
Explorer Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
Поток нужно останавливать из самого себя, т.е. держать какую-то разделяемую, атомарную переменную, которую выставлять в true. Это проверять в потоке и завершать основной цикл потока. Любое внешнее закрытие это в 99.99% случаев резальтат плохого решения или непонимания.
|
|||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Хорошо, "Любое внешнее закрытие это в 99.99% случаев резальтат плохого решения или непонимания." правильное мнение. Тогда зачем нужны функции exit(), terminate()?
|
|||
|
||||
vinter |
|
|||
Explorer Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
Потому что требования бывают разные и нормальные разработчики языка/API не имеют права ограничивать программиста. В идеале, программиста должна ограничивать только голова, а не возможности API. Возможно, у кого-то есть ситуация при которой без terminate()/exit() не обойтись, просто я таковой придумать, с ходу, не могу.
|
|||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
А если у меня именно такой случай?
Вообще-то вопросы задал конкретные, почему exit() не убивает поток и как быть с Android версией функции terminate()? Если решения с terminate()/exit() нет, то тогда придётся возится с флажками и не одним, в моём случае. |
|||
|
||||
bsa |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
OlegIT, exit() работает только тогда, когда у тебя в потоке запущен QEventLoop. Если он не запущен, то она ничего не делает.
terminate() работает только тогда, когда это разрешено (см. setTerminationEnabled). Как уже сказал vinter, правильно это делать путем установки флага. Мне лично не понятно, зачем тебе их больше одного? Есть только одна объективная причина использования прерывания потока - использование в потоке внешних вызовов, которые не возвращают управление и не позволяют себя прервать. Но такие функции крайне редкие в современном мире и, скорее всего, есть неблокирующая их версия. |
|||
|
||||
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |