Russian Qt Forum

Qt => Общие вопросы => Тема начата: phpCoder от Январь 30, 2015, 13:30



Название: Выйти из цикла и из функции
Отправлено: 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
У меня структура сложнее:
Код:
Цикл
    Функция 1
        Цикл
            Функция 2
        Цикл
            {...}
    Функция 3
        Цикл
            Функция 2


Название: 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
{
    Цикл
        Функция 1
            Цикл
                Функция 2
            Цикл
                {...}
        Функция 3
            Цикл
                Функция 2
}
catch(int e)
{
    ...
}
В "Функция 2" сделал:
Код
C++ (Qt)
if(_stop == true) throw 1;


Название: 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.
Нитку, как уже сказали, убивать очень плохо. Нужно в нитке предусмотреть корректное завершение.