Справочник по Ada 2005
9.7.2 Вызовы с таймером для входов
Вызов timed_entry_call производит вызов входа, который отменяется, если вызов (или повторная очередь с прерыванием вызова) не выбран до истечения времени. Вызов процедуры может появиться вместо вызова входа в тех случаях, когда процедура может быть реализована входом.
Синтаксис
Правила легальности
Если используется вызов_процедуры для procedure_or_entry_call, то имя_процедуры или префикс_процедуры вызов_процедуры должны статически обозначать вход, переименованный как процедура, или (вид) примитивной подпрограммы ограниченного интерфейса, первым параметром которого является управляющий параметр (см. 3.9.2).
Статическая семантика
Если вызов_процедуры используется для procedure_or_entry_call, и процедура реализуется входом, то имя_процедуры или префикс_процедуры и, возможно, первый параметр вызов_процедуры определяют целевой объект вызова и вызываемый вход.
Динамическая семантика
При выполнении timed_entry_call, имя_входа, имя_процедуры или префикс_процедуры, а также любые фактические параметры оцениваются, как и при простом вызове входа (см. 9.5.3) или вызове процедуры (см. 6.4). Время истечения (см. 9.6) для вызова определяется путем оценки выражения delay_expression альтернативы delay_delay_alternative. Если вызов является вызовом входа или вызовом процедуры, реализованной входом, то вызов входа выполняется. В противном случае вызов выполняется как описано в 6.4 для вызова процедуры, за которым следует последовательность_выражений альтернативы entry_call_alternative; последовательность_выражений альтернативы delay_alternative игнорируется.
Если вызов помещен в очередь (включая из-за повторной очереди с прерыванием), и не выбран до истечения времени, выполняется попытка отмены вызова. Если вызов завершается из-за отмены, необязательная последовательность_выражений альтернативы delay_alternative выполняется; если вызов входа завершается нормально, необязательная последовательность_выражений альтернативы entry_call_alternative выполняется.
Примеры
Пример вызова входа с таймером:
select
Controller.Request(Medium)(Some_Item);
or
delay 45.0;
-- контроллер слишком занят, попробуйте что-то другое
end select;
Controller.Request(Medium)(Some_Item);
or
delay 45.0;
-- контроллер слишком занят, попробуйте что-то другое
end select;