Руководство по Ada (Ada 2022)
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;