Справочник Ada 2012
9.7.2 Вызовы с таймаутом для входов
Вызов timed_entry_call делает вызов входа, который отменяется, если вызов (или повторный запрос с отказом вызова) не выбран до истечения времени. В случаях, когда процедура может быть реализована входом, может быть использован вызов процедуры вместо вызова входа.
Синтаксис
Правила легальности
Если для procedure_or_entry_call используется вызов_процедуры, то имя_процедуры или префикс_процедуры вызов_процедуры должны статически обозначать вход, переименованный как процедура, или (вид) примитивной подпрограммы ограниченного интерфейса, первым параметром которой является управляющий параметр (см. 3.9.2).
Динамическая семантика
При выполнении timed_entry_call, имя_входа, имя_процедуры или префикс_процедуры и любые фактические параметры оцениваются так же, как для простого вызова входа (см. 9.5.3) или вызова процедуры (см. 6.4). Время истечения (см. 9.6) для вызова определяется путем оценки выражение_задержки 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;