Название: Выйти из цикла и из функции Отправлено: phpCoder от Январь 30, 2015, 13:30 Добрый день.
Есть цикл, в теле которого запускаются функции. Эти функции в свою очередь запускают другие функции. Т.е. получается некая иерархия. И в глубине этой иерархии лежит, скажем так, главная функция. От ее результата зависит будет ли дальше работать цикл или из цикла нужно выйти. Так вот - как это сделать? Есть какой-нибудь универсальный способ завершить цикл и ранее вызванные функции? Просто тащить наверх ее результат не хочется - уж больно много if-else получится, громоздко. В этом цикле также присутствует объект QEventLoop. Из-за него цикл работает медленнее (без него не получится) и иногда нужно посередине выполнения прервать его. Название: Re: Выйти из цикла и из функции Отправлено: gil9red от Январь 30, 2015, 15:19 Например, бросьте исключение и ловите его, где вам нужно
Название: Re: Выйти из цикла и из функции Отправлено: phpCoder от Январь 30, 2015, 17:07 Все равно не понятно как исключение может прервать выполнение цикла и ряда вызванных функций.
Название: Re: Выйти из цикла и из функции Отправлено: torwig от Январь 30, 2015, 17:19 Исключение будет распространяться пока вы его не обработаете вплоть до того, что программа аварийно завершится, если его все-таки не поймать.
Название: Re: Выйти из цикла и из функции Отправлено: kambala от Январь 30, 2015, 18:28 если переписать сетевые запросы асинхронно, то все получится
Название: Re: Выйти из цикла и из функции Отправлено: phpCoder от Январь 30, 2015, 20:12 Ну хорошо. Цикл запущен, программа работает. Юзер нажимает на кнопку Стоп. Далее должно произойти нечто, что завершит выполнение цикла (а в цикле, как я сказал комба - QEventLoop + QNetworkAccessManager).
Как это нечто выглядит в коде, примерно? То, что было сказано выше сейчас для меня просто слова. Название: Re: Выйти из цикла и из функции Отправлено: Bepec от Январь 30, 2015, 20:19 Ставится обычная проверка на булевскую переменную. Пользун нажал, переменная хоп - в true. И цикл на следующей итерации делает break;.
Название: Re: Выйти из цикла и из функции Отправлено: phpCoder от Январь 30, 2015, 22:07 У меня структура сложнее:
Код: Цикл Название: Re: Выйти из цикла и из функции Отправлено: phpCoder от Январь 30, 2015, 22:09 if-esle тут громоздко. goto тоже не подойдет, т.к. вложенные циклы находятся внутри тела функций.
Название: Re: Выйти из цикла и из функции Отправлено: Bepec от Январь 31, 2015, 09:37 Это единственный "нормальный" выход из цикла.
Можно сделать проще - как делают многие программы - при нажатии стоп блокируют пользуна и выводят что то типа "подождите завершения операции". Название: Re: Выйти из цикла и из функции Отправлено: __Heaven__ от Январь 31, 2015, 13:05 Рубрика вредные советы.
Можно еще использовать оператор goto и убийства ниток :) По делу, не нужно брезговать if else. Пусть ваши функции возвращают bool. Помоему использовать исключения в цикле несколько дороговато Название: Re: Выйти из цикла и из функции Отправлено: phpCoder от Январь 31, 2015, 15:12 Сделал так:
Код: try Код
Название: Re: Выйти из цикла и из функции Отправлено: Bepec от Январь 31, 2015, 16:45 Тоже как вариант, вот только меня печалит то, что если там где то выделяется память new, она так и останется :D
Название: Re: Выйти из цикла и из функции Отправлено: qate от Февраль 02, 2015, 12:37 В этом цикле также присутствует объект QEventLoop. Из-за него цикл работает медленнее (без него не получится) и иногда нужно посередине выполнения прервать его. я бы уже посмотрел в сторону потоков ) зачем QEventLoop самому дергать ? Название: Re: Выйти из цикла и из функции Отправлено: phpCoder от Февраль 02, 2015, 23:17 А, т.е. в программе создать дополнительный поток и в нем выполнять мой супер-цикл? А прерывать выполнение цикла через убийство потока?
Название: Re: Выйти из цикла и из функции Отправлено: Bepec от Февраль 03, 2015, 00:46 Любое убийство потока или цикла ведёт к нежелательным последствиям. Другой вопрос, чтобы дать им завершиться самим.
Самое простое убийство - убийство процесса. Тогда система сама всё подчистит. Название: Re: Выйти из цикла и из функции Отправлено: __Heaven__ от Февраль 03, 2015, 11:27 qate имел в виду, что можно разгрузить ваш цикл избавившись от QEventLoop.
Нитку, как уже сказали, убивать очень плохо. Нужно в нитке предусмотреть корректное завершение. |