Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по QThread. 
:(
    Опции темы
OlegIT
Дата 3.3.2015, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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-ом?

PM MAIL   Вверх
vinter
Дата 7.3.2015, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



Поток нужно останавливать из самого себя, т.е. держать какую-то разделяемую, атомарную переменную, которую выставлять в true. Это проверять в потоке и завершать основной цикл потока. Любое внешнее закрытие это в 99.99% случаев резальтат плохого решения или непонимания. 


--------------------
Мой блог
PM MAIL WWW   Вверх
OlegIT
Дата 7.3.2015, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



Хорошо, "Любое внешнее закрытие это в 99.99% случаев резальтат плохого решения или непонимания." правильное мнение. Тогда зачем нужны функции exit(), terminate()?
PM MAIL   Вверх
vinter
Дата 8.3.2015, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



Потому что требования бывают разные и нормальные разработчики языка/API не имеют права ограничивать программиста. В идеале, программиста должна ограничивать только голова, а не возможности API. Возможно, у кого-то есть ситуация при которой без terminate()/exit() не обойтись, просто я таковой придумать, с ходу, не могу.


--------------------
Мой блог
PM MAIL WWW   Вверх
OlegIT
Дата 10.3.2015, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



А если у меня именно такой случай?
Вообще-то вопросы задал конкретные, почему exit() не убивает поток и как быть с Android версией функции terminate()? Если решения с terminate()/exit() нет, то тогда придётся возится с флажками и не одним, в моём случае.
PM MAIL   Вверх
bsa
Дата 11.3.2015, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



OlegIT, exit() работает только тогда, когда у тебя в потоке запущен QEventLoop. Если он не запущен, то она ничего не делает.

terminate() работает только тогда, когда это разрешено (см. setTerminationEnabled).

Как уже сказал vinter, правильно это делать путем установки флага. Мне лично не понятно, зачем тебе их больше одного?

Есть только одна объективная причина использования прерывания потока - использование в потоке внешних вызовов, которые не возвращают управление и не позволяют себя прервать. Но такие функции крайне редкие в современном мире и, скорее всего, есть неблокирующая их версия.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1409 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.