9.6. ОПЕРАТОРЫ ЗАДЕРЖКИ, ДЛИТЕЛЬНОСТЬ И ВРЕМЯ

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

оператор-задержки ::= delay простое-выражение;

Простое выражение должно быть предопределенного фиксированного типа DURATION (ДЛИТЕЛЬНОСТЬ); его значение выражается в секундах; оператор задержки с отрицательным значением эквивалентен оператору задержки с нулевым значением.

Все реализации типа DURATION должны допускать представление длительности (положительные и отрицательные) по крайней мере до 86 400 с (одни сутки); минимальная представи-мая длительность, DURATION'SMALL, должна быть не больше 20 мс (по возможности значение не превышает 50 мкс. Заметим, что DURATION'SMALL не обязано соответствовать основному циклу таймера, именованному числу SYSTEM.TICK (см. 13.7).

Определение типа TIME приведено в предопределенном пакете CALENDAR. Функция CLOCK возвращает текущее значение типа TIME. Функции YEAR, MONTH, DAY и SECONDS возвращают соответствующие наименованиям значения для заданного значения аргумента типа TIME, а процедура SPLIT возвращает одновременно все четыре соответствующих значения. Наоборот, функция TIME-OF упаковывает номера года, месяца, числа дня и значение длительности в значение типа TIME. В операции " + " и " -" для сложения и вычитания значений времени и длительности, а также в операции соотношения для значений времени вкладывают традиционный смысл.

Исключение TIME_ERROR возбуждается в функции TIME-OF, если значения фактических параметров не формируют правильную дату. Это исключение возбуждается также операциями "+" и "-", если для заданных операндов они не могут возвратить дату с номером года из диапазона соответствующего подтипа или если операция " -" не может возвратить значение из диапазона типа DURATION.

package CALENDAR is   type TIME is private;   subtype YEAR_NUMBER   is INTEGER   range 1901 .. 2099;   subtype MONTH_NUMBER is INTEGER   range 1 .. 12;   subtype DAY_NUMBER   is INTEGER   range 1 .. 31;   subtype DAY_DURATION  is DURATION range 0.0 .. 86_400.0;   function CLOCK return TIME;   function YEAR    (DATE : TIME) return YEAR_NUMBER;   function MONTH (DATE : TIME) return MONTH_NUMBER;   function DAY     (DATE : TIME) return DAY_NUMBER;   function SECONDS (DATE : TIME) return DAY_DURATION;   procedure SPLIT (DATE    : in TIME;                    YEAR    : out YEAR-NUMBER;                    MONTH   : out MONTH-NUMBER;                    DAY     : out DAY-NUMBER;                    SECONDS : out DAY_DURATION);   function TIME_OF(YEAR    : YEAR_NUMBER;                    MONTH   : MONTH_NUMBER;                    DAY     : DAY_NUMBER;                    SECONDS : DAY_DURATION := 0.0) return TIME;   function "+"   (LEFT : TIME;       RIGHT : DURATION) return TIME;   function "+"   (LEFT : DURATION; RIGHT : TIME)       return TIME;   function "-"   (LEFT : TIME;       RIGHT : DURATION) return TIME;   function "-"   (LEFT : TIME;       RIGHT : TIME)       return DURATION;   function "<"   (LEFT, RIGHT TIME) return BOOLEAN;   function "<=" (LEFT, RIGHT TIME) return BOOLEAN;   function ">"   (LEFT, RIGHT TIME) return BOOLEAN;   function ">=" (LEFT, RIGHT TIME) return BOOLEAN;   TIME_ERROR : exception;  -—  может быть возбуждено функцией и операциями "+" и "-"private   -— зависит от реализации end;

Примеры:

delay 3.0; -— задержка на 3.0 сdeclare   use CALENDAR;   -— INTERVAL глобальная константа типа DURATION    NEXT_TIME : TIME := CLOCK + INTERVAL;begin   loop      delay NEXT_TIME - CLOCK;      -— некоторые действия       NEXT_TIME := NEXT_TIME + INTERVAL;   end loop;end:

Примечание. Во втором примере цикл повторяется в среднем один раз каждые INTERVAL секунд. Этот интервал между двумя последовательными итерациями только приблизителен. Однако здесь не произойдет ошибки по длительности, поскольку длительность каждой итера-ции (существенно) меньше значения INTERVAL.

Ссылки: библиотечный модуль 10.1, вызов функции 6.4, длительность С, задача 9, личный тип 7.4, оператор 5, операция 4.5, операция отношения 4.5, операция сложения 4.5, пакет 7, простое выражение 4.4, тип 3.3, фиксированный тип 3.5.9.