Russian Qt Forum
Ноябрь 23, 2024, 13:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Выйти из цикла и из функции  (Прочитано 8678 раз)
phpCoder
Гость
« : Январь 30, 2015, 13:30 »

Добрый день.
Есть цикл, в теле которого запускаются функции. Эти функции в свою очередь запускают другие функции. Т.е. получается некая иерархия. И в глубине этой иерархии лежит, скажем так, главная функция. От ее результата зависит будет ли дальше работать цикл или из цикла нужно выйти. Так вот - как это сделать? Есть какой-нибудь универсальный способ завершить цикл и ранее вызванные функции? Просто тащить наверх ее результат не хочется - уж больно много if-else получится, громоздко.

В этом цикле также присутствует объект QEventLoop. Из-за него цикл работает медленнее (без него не получится) и иногда нужно посередине выполнения прервать его.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Январь 30, 2015, 15:19 »

Например, бросьте исключение и ловите его, где вам нужно
Записан

phpCoder
Гость
« Ответ #2 : Январь 30, 2015, 17:07 »

Все равно не понятно как исключение может прервать выполнение цикла и ряда вызванных функций.
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #3 : Январь 30, 2015, 17:19 »

Исключение будет распространяться пока вы его не обработаете вплоть до того, что программа аварийно завершится, если его все-таки не поймать.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Январь 30, 2015, 18:28 »

если переписать сетевые запросы асинхронно, то все получится
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
phpCoder
Гость
« Ответ #5 : Январь 30, 2015, 20:12 »

Ну хорошо. Цикл запущен, программа работает. Юзер нажимает на кнопку Стоп. Далее должно произойти нечто, что завершит выполнение цикла (а в цикле, как я сказал комба - QEventLoop + QNetworkAccessManager).
Как это нечто выглядит в коде, примерно? То, что было сказано выше сейчас для меня просто слова.
Записан
Bepec
Гость
« Ответ #6 : Январь 30, 2015, 20:19 »

Ставится обычная проверка на булевскую переменную. Пользун нажал, переменная хоп - в true. И цикл на следующей итерации делает break;.
Записан
phpCoder
Гость
« Ответ #7 : Январь 30, 2015, 22:07 »

У меня структура сложнее:
Код:
Цикл
    Функция 1
        Цикл
            Функция 2
        Цикл
            {...}
    Функция 3
        Цикл
            Функция 2
Записан
phpCoder
Гость
« Ответ #8 : Январь 30, 2015, 22:09 »

if-esle тут громоздко. goto тоже не подойдет, т.к. вложенные циклы находятся внутри тела функций.
Записан
Bepec
Гость
« Ответ #9 : Январь 31, 2015, 09:37 »

Это единственный "нормальный" выход из цикла.
Можно сделать проще - как делают многие программы - при нажатии стоп блокируют пользуна и выводят что то типа "подождите завершения операции".
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Январь 31, 2015, 13:05 »

Рубрика вредные советы.
Можно еще использовать оператор goto и убийства ниток Улыбающийся

По делу, не нужно брезговать if else. Пусть ваши функции возвращают bool. Помоему использовать исключения в цикле несколько дороговато
Записан
phpCoder
Гость
« Ответ #11 : Январь 31, 2015, 15:12 »

Сделал так:
Код:
try
{
    Цикл
        Функция 1
            Цикл
                Функция 2
            Цикл
                {...}
        Функция 3
            Цикл
                Функция 2
}
catch(int e)
{
    ...
}
В "Функция 2" сделал:
Код
C++ (Qt)
if(_stop == true) throw 1;
Записан
Bepec
Гость
« Ответ #12 : Январь 31, 2015, 16:45 »

Тоже как вариант, вот только меня печалит то, что если там где то выделяется память new, она так и останется Веселый
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #13 : Февраль 02, 2015, 12:37 »

В этом цикле также присутствует объект QEventLoop. Из-за него цикл работает медленнее (без него не получится) и иногда нужно посередине выполнения прервать его.

я бы уже посмотрел в сторону потоков )
зачем QEventLoop самому дергать ?
Записан
phpCoder
Гость
« Ответ #14 : Февраль 02, 2015, 23:17 »

А, т.е. в программе создать дополнительный поток и в нем выполнять мой супер-цикл? А прерывать выполнение цикла через убийство потока?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.234 секунд. Запросов: 22.