Использование таймеров
В платформе все типы форм для обработки своих событий поддерживают использование таймеров.
Обработчик таймер используется для реализации мониторинговых действий, выполняемых в фоновом режиме. Обработчик таймер вызывается через промежуток времени, заданный в поле формы период_таймера. Начало отсчета времени происходит сразу после создания формы. Если нужно принудительно остановить таймер, то полю формы период_таймера присваивается 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: д
д.ПОКАЗАТЬ_МОДАЛЬНЫЙ
КОНЕЦ