Интервальный таймер позволяет
задать интервал времени, по истечении которого будет запускаться некий программный код.
Возможность может оказаться полезной при создании интерактивных программ или в случае,
когда программа использует внешние данные, изменяющиеся во времени.
Функций, предназначенной для работы с таймером, всего три. Имена этих
функций начинаются префиксом tim. При работе WEB-компоненты функции недоступны.
|
Функция TIMSTART принимает два аргумента. Первый аргумент есть произвольное S-выражение.
Значением второго должно быть целое число (не превышаещее 231), которое задает
длину интервала в миллисекундах. При успехе функция возвращает T. Начиная
с этого момента, S-выражение, заданное первым аргументом будет периодически вычисляться.
Результат вычисления пропадает.
Рассмотрим пример:
(defun prt () (printsline "я здесь!"))
==> prt
(timStart '(prt) 3000)
==> T
я здесь!
я здесь!
я здесь!
|
Здесь создана функция, которая просто печатает строку "я здесь!". Далее запускается
таймер с интервалом 3 сек. Если запустить этот код в IDE, то строка "я здесь!"
будет каждые 3 сек появляться в области вывода. Пользователь может параллельно с работой
таймера выполнять какие-либо действия.
Этот пример не удастся выполнить в консольном режиме, что обусловлено спецификой взаимодействия
ActiveX-библиотеки HomeLispLib.exe с консольным движком Conlisp.exe. Но
это не означает, что таймером нельзя пользоваться в консольном режиме. Рассмотрим
следующий пример:
Здесь сначала создаются два замыкания с общим лексическим контекстом - функциям
next и reset доступна общая лексическая переменная c. При каждом
вызове next значение c увеличивается на единицу. Функция next
вызывается посредством таймера каждые 2 сек. Затем результат вызова timActivep
показывает, что таймер активен. Для того, чтобы убедиться, что параллельно с работой
таймера можно выполнять команды, вычисляется значение 100!. Далее, явный вызов
next подтверждает, что таймер "тикал" все это время - значение c оказывается
равным 15 (Разумеется, 100! вычислялся не 30 сек, просто автор нарочно немного
подождал...)
|