Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt: Существует ли метод завершения текущего потока? / 22 сообщений из 22, страница 1 из 1
05.11.2017, 23:54
    #39548175
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
Я создал задачи- объекты, унаследованные от QRunnable и скормил их QThreadPool.

Представим, что один из потоков не может дальше продолжать работать: например, не читается файл или память не выделяется... Как грохнуть только этот поток, оставив процесс и всё приложение в живых? Не хочется все методы потока делать функциями с возвращаемым значением, характеризующим наличие/отсутствие ошибок (и методы методов и методы методов методов....). Надо аналог terminate(), который грохнет только текущий поток.

Какие паттерны программирования применяют в подобных ситуациях?
...
Рейтинг: 0 / 0
06.11.2017, 02:27
    #39548239
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
return?
...
Рейтинг: 0 / 0
06.11.2017, 10:36
    #39548274
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
maytonreturn?

Беда в том, что вложенность методов может быть достаточно глубокой, и надо этот return "поднимать" в стеке вызовов до метода run(). Поэтому чтобы не запутаться необходимо ВСЕ возвращаемые значения использовать в качестве сигнала наличия/отсутствия ошибки. Не хочется так извращать логику программы.
...
Рейтинг: 0 / 0
06.11.2017, 10:57
    #39548280
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
Тебе надо грохнуть поток по твоему условию? Или разбираться в причинах почему он падает?
...
Рейтинг: 0 / 0
06.11.2017, 11:06
    #39548284
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
AlekseySQL... Не хочется все методы потока делать функциями с возвращаемым значением, характеризующим наличие/отсутствие ошибок (и методы методов и методы методов методов....). ...

Какие паттерны программирования применяют в подобных ситуациях?
Удаляют паттерны "лень", "руки из жо.." и делают как надо.

Читаем "методы обработки ошибок в программах"
...
Рейтинг: 0 / 0
06.11.2017, 11:09
    #39548287
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
Хотя методы убивания потока и есть, так делать не надо.

Это вам не ЯС и не Эрланг.
...
Рейтинг: 0 / 0
06.11.2017, 11:21
    #39548291
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
maytonТебе надо грохнуть поток по твоему условию? Или разбираться в причинах почему он падает?

авторПредставим, что один из потоков не может дальше продолжать работать: например, не читается файл или память не выделяется...

Что я могу выяснить, если операционная система не предоставила ресурсы? Если поток не может дальше работать, то его нужно просто грохнуть, а его задачу поставить в конец очереди (может к тому времени ОС сможет предоставить ресурсы).
...
Рейтинг: 0 / 0
06.11.2017, 12:15
    #39548326
вЪю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
AlekseySQLmaytonТебе надо грохнуть поток по твоему условию? Или разбираться в причинах почему он падает?

авторПредставим, что один из потоков не может дальше продолжать работать: например, не читается файл или память не выделяется...

Что я могу выяснить, если операционная система не предоставила ресурсы? Если поток не может дальше работать, то его нужно просто грохнуть, а его задачу поставить в конец очереди (может к тому времени ОС сможет предоставить ресурсы).
Изувер вы барин. Убивать работника только за то что вы дали ему кривой инструмент....
...
Рейтинг: 0 / 0
06.11.2017, 17:38
    #39548481
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
AlekseySQLmaytonreturn?

Беда в том, что вложенность методов может быть достаточно глубокой, и надо этот return "поднимать" в стеке вызовов до метода run(). Поэтому чтобы не запутаться необходимо ВСЕ возвращаемые значения использовать в качестве сигнала наличия/отсутствия ошибки. Не хочется так извращать логику программы.
Кинуть исключение, а наверху его поймать и return.
...
Рейтинг: 0 / 0
06.11.2017, 18:48
    #39548517
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
Dima TКинуть исключение, а наверху его поймать и return.

К этому варианту пока склоняюсь, настораживает только разбухание кода от обработки всех возможных исключений.
...
Рейтинг: 0 / 0
06.11.2017, 19:07
    #39548530
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
AlekseySQLDima TКинуть исключение, а наверху его поймать и return.

К этому варианту пока склоняюсь, настораживает только разбухание кода от обработки всех возможных исключений.
Зачем их много плодить? Это только для самых-самых критичных случаев, т.е. когда "что-то пошло не так".

Я не любитель исключений, но если они есть в используемой библиотеке, то с ними надо как-то жить. Классический совет: ловить только те исключения что в состоянии обработать. На самом верху можно ловить все и делать запись в лог, чтобы прогу совсем не остановило необработанное исключение.

В общем не надо все ошибки переводить на исключения, только критические.
...
Рейтинг: 0 / 0
06.11.2017, 21:09
    #39548566
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
Dima T,
Спасибо!
...
Рейтинг: 0 / 0
06.11.2017, 22:18
    #39548597
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
AlekseySQLmaytonТебе надо грохнуть поток по твоему условию? Или разбираться в причинах почему он падает?

авторПредставим, что один из потоков не может дальше продолжать работать: например, не читается файл или память не выделяется...

Что я могу выяснить, если операционная система не предоставила ресурсы? Если поток не может дальше работать, то его нужно просто грохнуть, а его задачу поставить в конец очереди (может к тому времени ОС сможет предоставить ресурсы).
Тут надо подумать архитектурно. Что за ошибка? Если ОС не может выделить память - то ситуация
аварийна ИМХО.

Если не память - то прошу прояснить сообществу что за ресурсы имелись в виду.
...
Рейтинг: 0 / 0
06.11.2017, 22:33
    #39548603
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
Мне одному кажется, что ТС путает поток и какой-то QT-шный объект-обёртку?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.11.2017, 09:38
    #39549361
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
maytonТут надо подумать архитектурно. Что за ошибка? Если ОС не может выделить память - то ситуация
аварийна ИМХО.

Если не память - то прошу прояснить сообществу что за ресурсы имелись в виду.

Все системные вызовы. В топике приведены примеры с памятью и обращение к файловой системе.
...
Рейтинг: 0 / 0
08.11.2017, 11:19
    #39549435
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
Появился вопрос по исключениям:

Функция http://en.cppreference.com/w/cpp/io/basic_istream/getline порождает исключения:
автор Exceptions
failure if an error occurred (the error state flag is not goodbit) and exceptions() is set to throw for that state.

If an internal operation throws an exception, it is caught and badbit is set. If exceptions() is set for badbit, the exception is rethrown.

, поэтому если их не перехватить где-нибудь выше по стеку, то приложение будет закрыто. Но зачем тогда устанавливаются флаги failbit и badbit? Ведь тогда их анализировать бессмысленно: в случае ошибки приложение будет закрыто и до анализа флагов программа просто не дойдет...
...
Рейтинг: 0 / 0
08.11.2017, 11:29
    #39549445
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
AlekseySQL,

предлагаю почитать учебник по языку с++

по самым по основам
...
Рейтинг: 0 / 0
08.11.2017, 12:08
    #39549476
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
SiemarglAlekseySQL,

предлагаю почитать учебник по языку с++

по самым по основам

По этому вопросу читал Страуструпа. Там говорится, что неперехваченные исключения вызывают terminate() и выполнение программы останавливается.
...
Рейтинг: 0 / 0
08.11.2017, 16:57
    #39549746
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
AlekseySQLSiemarglAlekseySQL,

предлагаю почитать учебник по языку с++

по самым по основам

По этому вопросу читал Страуструпа. Там говорится, что неперехваченные исключения вызывают terminate() и выполнение программы останавливается.
верно.

тогда просто нужно внимательнее вчитаться в ссылку по getline и работу исключений с стд::потоками
...
Рейтинг: 0 / 0
08.11.2017, 17:14
    #39549763
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
Siemarglверно.

тогда просто нужно внимательнее вчитаться в ссылку по getline и работу исключений с стд::потоками

В описании getline написано, что генерирует два исключения: failure и exceptions и при этом устанавливаются биты. Для перехвата исключения надо указать его тип, поэтому характер ошибки после перехвата и так ясен. Единственное что могу придумать для чего могут использоваться биты- при перехвате всех исключений с помощью конструкции catch(...).

Можно не писать загадками? Зачем перекидываться бестолковыми сообщениями?
...
Рейтинг: 0 / 0
08.11.2017, 17:23
    #39549770
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
AlekseySQL,

failure if an error occurred (the error state flag is not goodbit) and exceptions() is set to throw for that state. If an internal operation throws an exception, it is caugh t and badbit is set. If exceptions() is set for badbit, the exception is rethrown.
...
Рейтинг: 0 / 0
09.11.2017, 08:30
    #39550000
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt: Существует ли метод завершения текущего потока?
SiemarglAlekseySQL,

failure if an error occurred (the error state flag is not goodbit) and exceptions() is set to throw for that state. If an internal operation throws an exception, it is caugh t and badbit is set. If exceptions() is set for badbit, the exception is rethrown.

Насколько я понял загадки продолжаются. Желаю вам удачи.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt: Существует ли метод завершения текущего потока? / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]