Пауза в программе

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ал
✯ Ветеран ✯
Сообщения: 1014
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Пауза в программе

Сообщение Ал »

Дед Пахом писал(а): Нет окна - нарисуй и спрячь.
:), да так и делаю, иногда,
но речь о крайнем варианте - и в пятницу окно рисовать и прятать нехочу и в коде просто цепочка команд и вызовов процедур и и без окон/кнопок/опросов/..., но хочу паузу где-нибудь в середке?
:mrgreen:
Ладно, пошутили и будет, всем пока, а то автобус если пропущу - следующий минут через 40 только, за время ожидания следующего "схарчите" меня тут и без соли :idied:
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Пауза в программе

Сообщение Дед Пахом »

Пауза неинтересно, sleep уже упоминался. Цель-то топикстартера другая - дождаться ответа сервера, не блокируя программу. Я и написал проасинхронный запрос - типа SendAsync(), и где-то функция, которая автоматом вызовется при ответе сервера, никаких циклов/таймеров/пауз.
С уважением, ДП
Ал
✯ Ветеран ✯
Сообщения: 1014
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Пауза в программе

Сообщение Ал »

pansoft писал(а):Добрый день всем!
Задача такая: при нажатии кнопки отправляется запрос на сервер, ответ приходит через 1 до 5 минут(примерно).

Код: Выделить всё

Send() ! отправка запроса на сервере
loc:res=''
LOOP 
       loc:res=Respons() ! Проверка ответа на сервере
       If loc:res<>'' then break.
       .........
end
Как сделать в цикле паузу на 10-15 секунд?

Код: Выделить всё

Send() ! отправка запроса на сервере
loc:res=''
LOOP 
       loc:res=Respons() ! Проверка ответа на сервере
       If loc:res<>'' then break.
       BEEP(0,1000)
end

Код: Выделить всё

...
        MODULE('Windows API')
         SLEEP(LONG),PASCAL
        END
...
Send() ! отправка запроса на сервере
loc:res=''
LOOP 
       loc:res=Respons() ! Проверка ответа на сервере
       If loc:res<>'' then break.
        SLEEP(1000)
end
Таки придется стоять на остановке в паузе на 20 минут :(
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Пауза в программе

Сообщение Дед Пахом »

pansoft писал(а): Добрый день всем!Задача такая: при нажатии кнопки отправляется запрос на сервер, ответ приходит через 1 до 5 минут(примерно).Код: Выделить всёSend() ! отправка запроса на сервереloc:res=''LOOP loc:res=Respons() ! Проверка ответа на сервере If loc:res<>'' then break. .........end
Да, и такое впечатление, что Send() на самом деле и есть асинхронный вызов, но ответ сервера почему-то пытаемся прочитать через жопу.
С уважением, ДП
pansoft
Бывалый
Сообщения: 76
Зарегистрирован: 08 Август 2011, 11:37

Пауза в программе

Сообщение pansoft »

Дед Пахом писал(а): Да, и такое впечатление, что Send() на самом деле и есть асинхронный вызов, но ответ сервера почему-то пытаемся прочитать через жопу.
Да вот пытаюсь вашим libcurl достучатся до ЕГАИС, все работает великолепно, единственное с вот этим ответом встал вопрос.
Вообщем система такая:
Исходные составляющие мой компьютер на котором установлен УТМ-ЕГАИС(универсальный транспортный модуль) и сервер ЕГАИС где то в облаках.
1)К модулю посылаем запрос по http:\\localhost:8080 используя res = curl.SendRequestStr(), в res сразу же приходит идентификатор запроса.
2)УТМ шифрует, подписывает и отправляет запрос в облако.
3)В облаке формируется ответ(наверное опять шифруется) и отправляется в УТМ.
4)УТМ его расшифровывает и добавляет в список полученных документов.

5)Время от 1 пункта до 4 проходит примерно 2-5 минут. В течении этого времени необходимо проверять список входящих документов на наличие документа с нашим идентификатором используя res = curl.SendRequestStr().

6) Ура в списке появился документ с нашим идентификатором, и рядом ссылочка по которой мы можем забрать данный документ из УТМ используя res = curl.SendRequestStr().

Если этот алгоритм подходит под асинхронный Запрос, то дайте пожалуйста пример.
Последний раз редактировалось pansoft 20 Ноябрь 2015, 18:45, всего редактировалось 1 раз.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Пауза в программе

Сообщение Дед Пахом »

Если я правильно понял, то это 2 несвязанные между собой операции - запрос и появление документа в списке. То есть сервер отвечает, что он получил что-то, и началась дальнейшая обработка в облаке, ждите.... Тогда да, ты прав, без опроса в цикле или по таймеру не обойтись.
С уважением, ДП
pansoft
Бывалый
Сообщения: 76
Зарегистрирован: 08 Август 2011, 11:37

Пауза в программе

Сообщение pansoft »

Все правильно. Это я еще простенько описал так как в первой операции мы посылаем файл используя curl.PostFile, в пятой curl.SendRequestStr где возвращается строка, а в шестой curl.SendRequest потому что результат ответа приходит в файле.

Спасибо всем за предоставленные варианты реализации. Буду пробовать все, какой себя покажет лучше отчитаюсь позже.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Пауза в программе

Сообщение Дед Пахом »

Спасибо, за упоминание про libcurl, поднял настроение ;-) Значит, работаю не сразу в помойку.
С уважением, ДП
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Пауза в программе

Сообщение RaFaeL »

Дед Пахом писал(а): Спасибо, за упоминание про libcurl, поднял настроение Значит, работаю не сразу в помойку.
Думаю попозже для работы с Яндекс-Картами тоже попробовать библиотеку
pansoft
Бывалый
Сообщения: 76
Зарегистрирован: 08 Август 2011, 11:37

Пауза в программе

Сообщение pansoft »

pansoft писал(а): Буду пробовать все, какой себя покажет лучше отчитаюсь позже.
Попробовал SLEEP и TIMER.

Нашел применение обеим вариантам
Для SLEEP подошел вариант описанного алгоритм
pansoft писал(а): 1)К модулю посылаем запрос по http:\\localhost:8080 используя res = curl.SendRequestStr(), в res сразу же приходит идентификатор запроса.
2)УТМ шифрует, подписывает и отправляет запрос в облако.
3)В облаке формируется ответ(наверное опять шифруется) и отправляется в УТМ.
4)УТМ его расшифровывает и добавляет в список полученных документов.
5)Время от 1 пункта до 4 проходит примерно 2-5 минут. В течении этого времени необходимо проверять список входящих документов на наличие документа с нашим идентификатором используя res = curl.SendRequestStr().
6) Ура в списке появился документ с нашим идентификатором, и рядом ссылочка по которой мы можем забрать данный документ из УТМ используя res = curl.SendRequestStr().
получения справочника продукции, когда нужно чтобы пользователь обязательно дождался ответа (если нет ответа завершение цикла через пять минут), так как во время SLEEP ни что сделать на возможно, по этому пользователю остается только ждать.

Использование таймера TIMER позволяет сделать работу программы псевдо параллельной.
Пример на кассе пикнули сканером бутылку с алкоголем в результате запускается алгоритм, примерно такой же как в сверху, только
по времени 1-3 минуты,
при использовании TIMER можно дальше сканировать товар, только при обработке штрих - кода в самом начале отключать таймер LOC:StartStopTimer=0 а после завершения включать LOC:StartStopTimer=1.
В результате, между сканированиями, процедура будет запускаться, и когда придет ответ, выйдет подсказка.

Вывод SLEEP и TIMER два разных метода:
SLEEP - это РЕАЛЬНАЯ ПАУЗА, программа полностью не доступна.
TIMER - позволяет произвести какое то действие через определенный промежуток времени, не блокируя основные функции программы.
Последний раз редактировалось pansoft 21 Ноябрь 2015, 12:49, всего редактировалось 1 раз.
Ал
✯ Ветеран ✯
Сообщения: 1014
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Пауза в программе

Сообщение Ал »

Продумывали ли вариант разделения на 2 независимые программы? Пользователь из своей вызывает некую программу-сервис, который отрабатывает независимые далее от действий пользователя процедуры (видимо по пп1-4), а пользователь в своей живет своей жизнью и ждет/получает попутно обновления данных (пп5-6) ?
pansoft
Бывалый
Сообщения: 76
Зарегистрирован: 08 Август 2011, 11:37

Пауза в программе

Сообщение pansoft »

Да, думаю, на наверное в следующей версии.
Ал
✯ Ветеран ✯
Сообщения: 1014
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Пауза в программе

Сообщение Ал »

RaFaeL писал(а):
Ал писал(а): в коде где нужна пауза может просто не быть окна?
В исходном задании сказано "при нажатии кнопки", раз есть кнопка то должно быть и окно?
Вчера торопился, не написал, пишу сейчас - что бы новички, читающие наши сообщения, понимали что теоретически есть ещё "извращенный" случай с кнопками и без окна (WINDOW) в обычном понимании кларион-программиста, т.е. "нарисованного ручками в дизайнере, описанного ручками или созданного шаблонами и опрашиваемого в программе обычными способами (Accept/...) , я про MESSAGE, он тоже КНОПКУ выводит в своем ОКНЕ, например есть просто source-программка ВООБЩЕ без окон построенных при помощи WINDOW, в коде которой идут (пп1-4? :lol: ) ну и где-то там в недрах:

Код: Выделить всё

...
  System{PROP:FontSize} = 16 !для вывода пользователю текста покрупнее на больших диагоналях))
  MESSAGE('Старт ... ')    ! тут будет одна кнопка
....   
    System{PROP:FontSize} = 16 !для вывода покрупнее на больших диагоналях
    CASE MESSAGE('Quit?','Editor',ICON:Question,BUTTON:Yes+BUTTON:No,BUTTON:No,1) !тут пара кнопок
    OF BUTTON:No                         !the window is System Modal,no copy ability
        return
    OF BUTTON:Yes
        MESSAGE('Goodbye|So Long|Sayonara') !A 3-line message with only an Ok button.
        RETURN
    END
...
vd-vuf
Бывалый
Сообщения: 61
Зарегистрирован: 12 Декабрь 2008, 12:09
Откуда: Верхний Уфалей
Контактная информация:

Пауза в программе

Сообщение vd-vuf »

а еще при получении идента из сети (п.4) генерить событие "але, тут пришло сообщение ловите кому нада"
.. те кому нада, к примеру, регятся в очереди указывая свой thread
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Пауза в программе

Сообщение Yufil »

Ещё хочу напомнить про команду IDLE (см.доку), которая вешает глобальный обработчик на таймер.
В отличие от таймера, её не надо распихивать на все окна.

А в ряде случаев без неё вообще никак - есть развесистая структура окон, и каждое может запускать таймер... :? В общем, спасает
Ответить