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

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 (см. ниже), либо типом Time в пакете Real_Time (см. D.8), или некоторым другим типом времени, определённым реализацией.

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

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

package Ada.Calendar is
type Time is private;
subtype Year_Number is Integer range 1901 .. 2399;
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 вызывается со значением seconds 86_400.0, возвращаемое значение равно значению Time_Of для следующего дня со значением seconds 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; она также может допускать представление других дат (как более ранних, так и более поздних).

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

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

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

В реализации, по возможности, значение Duration'Small следует установить не более чем 100 микросекунд.
Временная база для delay_relative_statement должна быть монотонной; она не обязана быть той же временной базой, что и Calendar.Clock.
ПРИМЕЧАНИЯ
33 Оператор delay_relative_statement с отрицательным значением delay_expression эквивалентен оператору с нулевым значением.
34 Выполнение оператора delay_statement может быть выполнено задачей среды; следовательно, операторы delay_statement могут выполняться как часть разработки элемента library_item или выполнения основной подпрограммы. Такие операторы приостанавливают выполнение задачи среды (см. 10.2).
35 Оператор delay_statement является точкой завершения прерывания и потенциально блокирующей операцией, даже если задача фактически не блокируется.
36 Нет необходимой связи между System.Tick (разрешение часов пакета Calendar) и Duration'Small (small типа Duration).
37 Дополнительные требования, связанные с операторами delay_statement, приведены в 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