Описание функций работы с таймером

Интервальный таймер позволяет задать интервал времени, по истечении которого будет запускаться некий программный код. Возможность может оказаться полезной при создании интерактивных программ или в случае, когда программа использует внешние данные, изменяющиеся во времени.

Функций, предназначенной для работы с таймером, всего три. Имена этих функций начинаются префиксом tim. При работе WEB-компоненты функции недоступны.

Имя функции К-во аргументов Тип аргументов Выполняемое действие
TIMSTART   2 1 - ANY; 2 - FIXED Запускает таймер. При успехе возвращает T.
TIMSTOP   - - Останавливает таймер.
TIMACTIVEP   - - Проверяет, запущен ли таймер. При запущенном таймере возвращает T, в противном случае возвращает Nil.
TIMSTART  

Функция 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 сек, просто автор нарочно немного подождал...)

TIMSTOP  

Функция TIMSTOP не требует параметров. Если таймер был запущен, вызов функции остановит его. В противном случае выполнение функции ничего не меняет в сосотоянии Лисп-машины. Функция всегда возвращает T.

TIMACTIVEP  

Функция-предикат TIMACTIVEP не требует параметров. Если таймер был запущен, функция вернет T, в противном случае функция вернет Nil.