Руководство разработчика

Использование таймеров

В платформе все типы форм для обработки своих событий поддерживают использование таймеров.

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

См. также: