Бесконечный цикл

norbiq

Client
Регистрация
25.03.2013
Сообщения
19
Благодарностей
1
Баллы
3
Всем добрый день!
Подскажите пожалуйста, как сделать правильно.
Нужную задачу реализовал, но теоретически, в случае не прихода смс я получаю бесконечный цикл.
108903


Получаю по Апи номер телефона.
Нажимаю в поле для ввода номера телефона.
Ввожу номер телефона.
Нажимаю получить код.
Жду 10 секунд.
Отправляю Get запрос о статусе и получаю ответ Wait или Ok.
В случае Ok, получаю через Апи код с сервиса.
В случае Wait жду 10 секунд...
 

Ахилес

Client
Read only
Регистрация
11.11.2020
Сообщения
957
Благодарностей
387
Баллы
63

Deisler

Client
Регистрация
26.10.2019
Сообщения
483
Благодарностей
185
Баллы
43
Всем добрый день!
Подскажите пожалуйста, как сделать правильно.
Нужную задачу реализовал, но теоретически, в случае не прихода смс я получаю бесконечный цикл.
Посмотреть вложение 108903

Получаю по Апи номер телефона.
Нажимаю в поле для ввода номера телефона.
Ввожу номер телефона.
Нажимаю получить код.
Жду 10 секунд.
Отправляю Get запрос о статусе и получаю ответ Wait или Ok.
В случае Ok, получаю через Апи код с сервиса.
В случае Wait жду 10 секунд...
В вашем случае я бы не проверял ожидаемый ответ через Regex. При таком подходе если придет Ок, то вы продолжите работу - тут все правильно, но если придет вместо wait, например Error, или что то другое, что отдает сервер когда истечет время ожидания, или когда какая то ошибка вылезла, то вместо того что бы прервать работу, будете продолжать думать что вам пришло Wait и будете ждать 10 секунд и повторять это до бесконечности.
В данном случае неправильно ставить счетчик что бы прервало через 10-20-30 неудачных выходов. В вашем случае надо именно проверять ответ через if или switch. На точное вхождение ответа. То есть если через if или switch сравнились с Ок и вышли по успеху - идете брать результат. Если нет, то сравниваете с Wait - если вышли по успеху - идете ждать 10 секунд. Если любой другой ответ - выходите по ошибке сразу, а не гоняете цикл еще 10-20-30 повторений.


А вообще, если есть вероятность возникновения бесконечного цикла, то нужно создать переменную счетчик, который будет на каждом круге прибавлять +1 сам к себе. Далее проверяете не достиг ли счетчик, к примеру 30 повторений. Если нет, идем на следующий круг. Если достиг ограничения в 30, то завершаете работу или предусматриваете сценарий на этот случай (перезагрузить страницу, например). При этом надо не забыть обнулять этот счетчик после выхода из цикла
 
  • Спасибо
Реакции: norbiq

norbiq

Client
Регистрация
25.03.2013
Сообщения
19
Благодарностей
1
Баллы
3

norbiq

Client
Регистрация
25.03.2013
Сообщения
19
Благодарностей
1
Баллы
3
В вашем случае я бы не проверял ожидаемый ответ через Regex. При таком подходе если придет Ок, то вы продолжите работу - тут все правильно, но если придет вместо wait, например Error, или что то другое, что отдает сервер когда истечет время ожидания, или когда какая то ошибка вылезла, то вместо того что бы прервать работу, будете продолжать думать что вам пришло Wait и будете ждать 10 секунд и повторять это до бесконечности.
В данном случае неправильно ставить счетчик что бы прервало через 10-20-30 неудачных выходов. В вашем случае надо именно проверять ответ через if или switch. На точное вхождение ответа. То есть если через if или switch сравнились с Ок и вышли по успеху - идете брать результат. Если нет, то сравниваете с Wait - если вышли по успеху - идете ждать 10 секунд. Если любой другой ответ - выходите по ошибке сразу, а не гоняете цикл еще 10-20-30 повторений.


А вообще, если есть вероятность возникновения бесконечного цикла, то нужно создать переменную счетчик, который будет на каждом круге прибавлять +1 сам к себе. Далее проверяете не достиг ли счетчик, к примеру 30 повторений. Если нет, идем на следующий круг. Если достиг ограничения в 30, то завершаете работу или предусматриваете сценарий на этот случай (перезагрузить страницу, например). При этом надо не забыть обнулять этот счетчик после выхода из цикла
Моя ошибка, я не показал внутрянку.
У меня стоит if только на OK, все остальное это на повтор. Читал Апи сервиса, думал сначала сделать через Switch (нужный ответ дальше, каждый не нужный возвращает на таймер). В итоге в Апи нашел около 8-9 ответов, каждый заносить, показалось бредом, поэтому сделал проверку только на "Ок".
108904
 

Deisler

Client
Регистрация
26.10.2019
Сообщения
483
Благодарностей
185
Баллы
43
Моя ошибка, я не показал внутрянку.
У меня стоит if только на OK, все остальное это на повтор. Читал Апи сервиса, думал сначала сделать через Switch (нужный ответ дальше, каждый не нужный возвращает на таймер). В итоге в Апи нашел около 8-9 ответов, каждый заносить, показалось бредом, поэтому сделал проверку только на "Ок".
Посмотреть вложение 108904
У вас не if стоит. У вас кубик обработки текста. Вам надо сделать две проверки. На Ok и на Wait (Можно через этот же кубик обработки текста сделать, двумя кубиками) Все остальные ответы считать ошибкой. Сейчас у вас ответ ошибки обрабатывается так же как и ответ Wait. Как это сделать описал вам в предыдущем ответе. Так же описал и то как поставить счетчик, который в вашем случае ставить неправильно. Почему так же объяснил в предыдущем ответе
 
  • Спасибо
Реакции: norbiq

norbiq

Client
Регистрация
25.03.2013
Сообщения
19
Благодарностей
1
Баллы
3
У вас не if стоит. У вас кубик обработки текста. Вам надо сделать две проверки. На Ok и на Wait (Можно через этот же кубик обработки текста сделать, двумя кубиками) Все остальные ответы считать ошибкой. Сейчас у вас ответ ошибки обрабатывается так же как и ответ Wait. Как это сделать описал вам в предыдущем ответе. Так же описал и то как поставить счетчик, который в вашем случае ставить неправильно. Почему так же объяснил в предыдущем ответе
Да, про Switch понял, полностью согласен. Не все значения прописывать, а грубо Да/Нет/Цикл. Спасибо!
Со счетчиком пока не пойму как это реализовать... Не может ли быть такое, что Wait например все время будет висеть...
 

Deisler

Client
Регистрация
26.10.2019
Сообщения
483
Благодарностей
185
Баллы
43
Как это сделать?
Я пока совсем не профи)
Обведите элементы, которые должны повтряться в цикле только определенное количество раз, нажмите правой кнопкой мыши в выберите "повторять в цикле". Изучите какие кубики появятся. Понять зачем они будет не сложно. НО убедитесь что все выходы проставятся правильно. Зачастую выходы из цикла этот инструмент проставляет не правильно.
Так же не забудьте присвоить переменной счетчика 0 при выходе из цикла по успеху
 
  • Спасибо
Реакции: norbiq

Deisler

Client
Регистрация
26.10.2019
Сообщения
483
Благодарностей
185
Баллы
43
Да, про Switch понял, полностью согласен. Не все значения прописывать, а грубо Да/Нет/Цикл. Спасибо!
Со счетчиком пока не пойму как это реализовать... Не может ли быть такое, что Wait например все время будет висеть...
на сколько я знаю во всех сервисах по аренде номеров через 15-20 минут аренда заканчивается и в ответ уже будет приходить не wait. Проверьте это на вашем сервисе
 
  • Спасибо
Реакции: norbiq

norbiq

Client
Регистрация
25.03.2013
Сообщения
19
Благодарностей
1
Баллы
3
В вашем случае я бы не проверял ожидаемый ответ через Regex. При таком подходе если придет Ок, то вы продолжите работу - тут все правильно, но если придет вместо wait, например Error, или что то другое, что отдает сервер когда истечет время ожидания, или когда какая то ошибка вылезла, то вместо того что бы прервать работу, будете продолжать думать что вам пришло Wait и будете ждать 10 секунд и повторять это до бесконечности.
В данном случае неправильно ставить счетчик что бы прервало через 10-20-30 неудачных выходов. В вашем случае надо именно проверять ответ через if или switch. На точное вхождение ответа. То есть если через if или switch сравнились с Ок и вышли по успеху - идете брать результат. Если нет, то сравниваете с Wait - если вышли по успеху - идете ждать 10 секунд. Если любой другой ответ - выходите по ошибке сразу, а не гоняете цикл еще 10-20-30 повторений.


А вообще, если есть вероятность возникновения бесконечного цикла, то нужно создать переменную счетчик, который будет на каждом круге прибавлять +1 сам к себе. Далее проверяете не достиг ли счетчик, к примеру 30 повторений. Если нет, идем на следующий круг. Если достиг ограничения в 30, то завершаете работу или предусматриваете сценарий на этот случай (перезагрузить страницу, например). При этом надо не забыть обнулять этот счетчик после выхода из цикла
Что-то совсем туплю, подскажите пожалуйста.
108928

Создал Switch, по дефолту выход в предупреждение.
Проверяем два ответа (желтый квадрат). Нужно проверять по слову, например WAIT и OK. Потому что в OK, коды всегда разные. Что правильно в значение тогда написать? Все время выходит по дефолту, не находит значения слов в переменной smsStatus.
 

Deisler

Client
Регистрация
26.10.2019
Сообщения
483
Благодарностей
185
Баллы
43
В if или switch мы сравниваемся со значениями, которые на 100% совпадают. Вплоть до регистра.
Если у вас совпадение не полное (есть рандомная часть) то вам первую проверку надо делать через кубик, который вы и делали - regex. В котором вы ищите OK. Находите, идете получать статус. А если не находите, то идете не на второй круг, а на вторую проверку. Вторая проверка может быть реализована на этом же кубике regex в котором вы ищите WAIT или же вторая проверка может быть реализована через кубик if, в котором сверяться нужно уже с полных ответом "STATUS_WAIT_CODE".
Этими двумя проверками вы проверяете все нужные вам варианты (я так понял что это все нужные варианты). И исходя из этого сможете правильно развести дальнейшую логику.


Вообще я вам советую посмотреть базовый курс, в который можно попасть при загрузке PM. У вас совсем базовые вопросы. Без их понимания вы будете встречаться со сложностями каждые пол часа
 
Последнее редактирование:

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 547
Благодарностей
912
Баллы
113
Всем добрый день!
Подскажите пожалуйста, как сделать правильно.
Нужную задачу реализовал, но теоретически, в случае не прихода смс я получаю бесконечный цикл.
Посмотреть вложение 108903

Получаю по Апи номер телефона.
Нажимаю в поле для ввода номера телефона.
Ввожу номер телефона.
Нажимаю получить код.
Жду 10 секунд.
Отправляю Get запрос о статусе и получаю ответ Wait или Ok.
В случае Ok, получаю через Апи код с сервиса.
В случае Wait жду 10 секунд...
Создай переменную try_1, установи для нее значение по умолчанию и используя этот код, цикл будет выполняться столько раз, сколько стоит в переменной try_1

C#:
Thread.Sleep(50);
int Try = int.Parse(project.Variables["try_1"].Value) -1 ;
project.Variables["try_1"].Value = Try.ToString();
if ( Try <=0 ) throw new Exception();
else return 0;
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)