Использование таймеров
В платформе все типы форм для обработки своих событий поддерживают использование таймеров.
Обработчик таймер используется для реализации мониторинговых действий, выполняемых в фоновом режиме. Обработчик таймер вызывается через промежуток времени, заданный в поле формы период_таймера. Начало отсчета времени происходит сразу после создания формы. Если нужно принудительно остановить таймер, то полю формы период_таймера присваивается 0, а затем вызывается метод ОБНОВИТЬ. Аналогичным образом можно повторно запустить таймер, присвоив полю период_таймера ненулевое значение.
Для создания отложенных функций по таймеру обработчик таймер не подходит, для этой цели используется обработчик таймер_задержки. Данный обработчик вызывается после запуска таймера при помощи функции СТАРТ_ТАЙМЕР_ЗАДЕРЖКИ. Функция СТАРТ_ТАЙМЕР_ЗАДЕРЖКИ создает именованный таймер, за счет этого она позволяет использовать одномоментно несколько именованных таймеров, в отличие от поля период_таймера, которое позволяет задавать только один таймер. Кроме того, функция СТАРТ_ТАЙМЕР_ЗАДЕРЖКИ используется для перезапуска ранее запущенного именованного таймера путем повторного вызова.
Если обработчик таймер_задержки возвращает значение ДА, то таймер продолжает свою работу, при возврате значения НЕТ таймер будет остановлен. Для принудительной остановки именованного таймера используется функция СТОП_ТАЙМЕР_ЗАДЕРЖКИ.
Таймеры задержки отложенного действия используются, когда обработка события, которое было инициировано пользователем путем взаимодействия с формой, занимает много времени. Например, таким событием может быть запрос данных из базы данных. Если производить запрос к базе данных на каждое действие пользователя, то выдача ответа на запрос будет происходить долго и с задержкой. Обработка событий по таймеру позволяет выполнить длительное действие после того, как, например, пользователь не меняет выбранный элемент в переключателе в течение заданного периода.
Пример 1
В качестве примера рассматривается выбор элемента при помощи переключателя. По прошествии 3 секунд задержки после выбора элемента переключателя в списке происходит обновление данных в соответствии с выбранным элементом переключателя.
ТИП Диалог_с_задержкой(ДИАЛОГ) [ ... ПОДМЕНА таймер_задержки = {Выбор_таймер}; СПИСОК: Список1 = [ ... элементы = () ]; РАДИОГРУППА: Радиогруппа1 = [ ... выбор = 0, элементы = ( "Фамилия", "Имя", "Должность" ), изменение = {Выбор} ]; ... ФУНКЦИЯ ЛОГИКА: Выбор_таймер(ПЕРЕМ ФОРМА: форма; СТРОКА: имя_таймера; ЧИСЛО: прошло) ЕСЛИ имя_таймера = "Выбор" ТО ВЫБОР(Радиогруппа1.выбор) #1: Список1.элементы = ("Попов","Петров","Сидоров") ОБНОВИТЬ #2: Список1.элементы = ("Петя", "Вася", "Ваня") ОБНОВИТЬ #3: Список1.элементы = ("продавец", "конструктор", "водитель") ОБНОВИТЬ КОНЕЦ_ВЫБОРА КОНЕЦ_ЕСЛИ РЕЗУЛЬТАТ = НЕТ КОНЕЦ_ФУНКЦИИ ФУНКЦИЯ Выбор(ПЕРЕМ РАДИОГРУППА: список) СТАРТ_ТАЙМЕР_ЗАДЕРЖКИ("Выбор", 3) КОНЕЦ_ФУНКЦИИ ] ВЫЧИСЛИТЬ ПЕРЕМ Диалог_с_задержкой: д // д<- данные ЕСЛИ д.ПОКАЗАТЬ_МОДАЛЬНЫЙ <> "" ТО // д -> данные КОНЕЦ_ЕСЛИ КОНЕЦ
Пример 2
На примере автозакрытия окна через 10 секунд демонстрируется продление обработчиком времени работы таймера. Пока время работы таймера меньше 10, обработчик возвращает значение ДА и таймер продолжает работать, как только время работы таймера становится больше 10 - его работа прекращается и обработчик возвращает НЕТ. Для принудительного прекращения работы таймера реализована специальная кнопка.
ТИП Диалог1(ДИАЛОГ) [ ... ПОДМЕНА таймер_задержки = {ТаймерЗадержки}; ЧИСЛО: время_закрытия = 10; КНОПКА: Стоп = [ ... текст = "Стоп", нажатие = {СтопНажат} ]; КНОПКА: Отсчет = [ ... текст = "Отсчет", нажатие = {ОтсчетНажат} ]; ТЕКСТ: Текст1 = [ ... текст = "Нажмите ""Отсчет"" для закрытия с задержкой..." ]; ... ] ФУНКЦИЯ Диалог1.ОтсчетНажат(ПЕРЕМ КНОПКА: кнопка) СТАРТ_ТАЙМЕР_ЗАДЕРЖКИ("АвтоЗакрытие", 1) ОбновитьОтсчет(0) КОНЕЦ_ФУНКЦИИ ФУНКЦИЯ Диалог1.СтопНажат(ПЕРЕМ КНОПКА: кнопка) СТОП_ТАЙМЕР_ЗАДЕРЖКИ("АвтоЗакрытие") ОбновитьСообщение("Закрытие отменено.") КОНЕЦ_ФУНКЦИИ ФУНКЦИЯ ЛОГИКА: Диалог1.ТаймерЗадержки(ПЕРЕМ ФОРМА: форма; СТРОКА: имя_таймера; ЧИСЛО: прошло) РЕЗУЛЬТАТ = НЕТ ЕСЛИ имя_таймера = "АвтоЗакрытие" ТО ЕСЛИ прошло < время_закрытия ТО ОбновитьОтсчет(прошло) РЕЗУЛЬТАТ = ДА // продолжать ИНАЧЕ ОбновитьСообщение("Закрываем...") ЗАКРЫТЬ("АВТО") КОНЕЦ_ЕСЛИ КОНЕЦ_ЕСЛИ КОНЕЦ_ФУНКЦИИ ФУНКЦИЯ Диалог1.ОбновитьСообщение(СТРОКА: текст) Текст1.текст = текст Текст1.ОБНОВИТЬ КОНЕЦ_ФУНКЦИИ ФУНКЦИЯ Диалог1.ОбновитьОтсчет(ЧИСЛО: прошло) ОбновитьСообщение("До закрытия осталось " + СТР(ОКРУГЛ(время_закрытия - прошло)) + " ...") КОНЕЦ_ФУНКЦИИ ВЫЧИСЛИТЬ ПЕРЕМ Диалог1: д д.ПОКАЗАТЬ_МОДАЛЬНЫЙ КОНЕЦ