Spec-Zone.ru › Ada 95
Справочник по Ada 95

9.6 Операторы задержки, продолжительность и время

Оператор delay_statement используется для приостановки дальнейшего выполнения до достижения заданного времени истечения. Время истечения можно задать либо как конкретную точку во времени (в операторе delay_until_statement), либо как значение в секундах от текущего времени (в операторе delay_relative_statement). Определённый в языке пакет Calendar предоставляет определения для типа Time и связанных операций, включая функцию Clock, которая возвращает текущее время.

Синтаксис

delay_statement ::= delay_until_statement | delay_relative_statement
delay_until_statement ::= delay until delay_expression;
delay_relative_statement ::= delay delay_expression;

Правила разрешения имён

Ожидаемый тип для delay_expression в операторе delay_relative_statement — предопределённый тип Duration. Ожидаемый тип для delay_expression в операторе delay_until_statement — любой нелимитированный тип.

Правила легальности

Может быть несколько временных баз, каждая с соответствующим таймером и соответствующим типом времени. Тип delay_expression в операторе delay_until_statement должен быть типом времени — либо типом Time, определённым в пакет Calendar языка (см. ниже), либо каким-то другим типом времени, определённым реализацией (см. D.8).

Статическая семантика

Существует предопределённый тип с плавающей запятой, названный Duration, объявленный во видимой части пакета Standard; значение типа Duration используется для представления длительности временного интервала, выраженной в секундах. Тип Duration не специфичен для определённой временной базы, но может использоваться с любой временной базой.
Значение типа Time в пакете Calendar, или любого другого типа времени, определённого реализацией, представляет время, как его показывает соответствующий таймер.
Существует следующий определённый в языке библиотечный пакет:

package Ada.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 Ada.Calendar;

Динамическая семантика

Для выполнения оператора delay_statement сначала вычисляется delay_expression. Для оператора delay_until_statement время истечения задержки равно значению delay_expression в временной базе, связанной с типом expression. Для оператора delay_relative_statement время истечения определяется как текущее время в временной базе, связанной с относительными задержками, плюс значение delay_expression, преобразованное в тип Duration, и затем округлённое до следующего тика таймера. Временная база, связанная с относительными задержками, определена в D.9, «Точность задержки», или определяется реализацией.
Задача, выполняющая оператор delay_statement, приостанавливается до достижения времени истечения, в этот момент она снова становится готовой. Если время истечения уже прошло, задача не приостанавливается.
Если попытка отмены delay_statement (в рамках asynchronous_select или прерывания — см. 9.7.4 и 9.8) не привела к истечению времени, оператор задержки отменяется, тем самым завершая оператор delay_statement.
Временная база, связанная с типом Time пакета Calendar, определяется реализацией. Функция Clock пакета Calendar возвращает значение, представляющее текущее время для этой временной базы. Определённое реализацией значение именованного числа System.Tick (см. 13.7) приближённо соответствует длительности реального временного интервала, в течение которого значение Calendar.Clock остаётся постоянным.
Функции Year, Month, Day и Seconds возвращают соответствующие значения для данного значения типа Time, соответствующие определённому реализацией часовому поясу; процедура Split возвращает все четыре соответствующих значения. В обратном порядке, функция Time_Of объединяет номер года, номер месяца, номер дня и продолжительность в значение типа Time. Операторы «+» и «-» для сложения и вычитания времени и продолжительности, и реляционные операторы для времени, имеют общепринятое значение.
Если Time_Of вызывается со значением секунд 86_400.0, возвращаемое значение равно значению Time_Of для следующего дня со значением секунд 0.0. Значение, возвращаемое функцией Seconds или через параметр Seconds процедуры Split, всегда меньше 86_400.0.
Исключение Time_Error возбуждается функцией Time_Of, если фактические параметры не образуют корректную дату. Это исключение также возбуждается операторами «+» и «-», если результат не может быть представлен в типе Time или Duration соответственно. Это исключение также возбуждается функциями Year, Month, Day и Seconds и процедурой Split, если номер года заданной даты находится вне диапазона подтипа Year_Number.

Требования к реализации

Реализация типа Duration должна допускать представление временных интервалов (как положительных, так и отрицательных) до как минимум 86400 секунд (один день); Duration'Small не должен быть больше двадцати миллисекунд. Реализация типа Time должна допускать представление всех дат с номерами года в диапазоне Year_Number; она также может допускать представление других дат (как более ранних, так и более поздних).

Разрешения реализации

Реализация может определить дополнительные типы времени (см. D.8).
Реализация может возбудить Time_Error, если значение delay_expression в операторе delay_until_statement оператора select_statement представляет время более чем на 90 дней после текущего времени. Фактический предел, если таковой имеется, определяется реализацией.

Рекомендации по реализации

По возможности в реализации, значение Duration'Small должно быть не больше 100 микросекунд.
Временная база для операторов delay_relative_statement должна быть монотонной; она не должна совпадать с временной базой, используемой для Calendar.Clock.
ПРИМЕЧАНИЯ
31 Оператор delay_relative_statement с отрицательным значением delay_expression эквивалентен оператору с нулевым значением.
32 Оператор delay_statement может быть выполнен задачей среды; следовательно, операторы delay_statement могут выполняться в рамках разработки library_item или выполнения основной подпрограммы. Такие операторы задерживают задачу среды (см. 10.2).
33 Оператор delay_statement является точкой завершения прерывания и потенциально блокирующей операцией, даже если задача фактически не блокируется.
34 Между System.Tick (разрешением часов пакета Calendar) и Duration'Small (small типа Duration) нет необходимой связи.
35 Дополнительные требования, связанные с delay_statements, приведены в D.9, «Точность задержки».

Примеры

Пример инструкции относительной задержки:
delay 3.0; -- задержка на 3.0 секунды
Пример периодической задачи:
declare
use Ada.Calendar;
Next_Time : Time := Clock + Period;
-- Period - глобальная константа типа Duration
begin
loop -- повторяется каждые Period секунд
delay until Next_Time;
... -- выполнить некоторые действия
Next_Time := Next_Time + Period;
end loop;
end;


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API