Spec-Zone.ru › Ada 95
Справочное руководство Ada 95

9.7.1 Выбор приема

Этот вид оператора select_statement позволяет сочетать ожидание и выбор из одного или нескольких альтернатив. Выбор может зависеть от условий, связанных с каждой альтернативой оператора selective_accept.

Синтаксис

selective_accept ::=
select
[guard]
select_alternative
{ or
[guard]
select_alternative }
[ else
sequence_of_statements ]
end select;
guard ::= when condition =>
select_alternative ::=
accept_alternative
| delay_alternative
| terminate_alternative
accept_alternative ::=
accept_statement [sequence_of_statements]
delay_alternative ::=
delay_statement [sequence_of_statements]
terminate_alternative ::= terminate;
Оператор selective_accept должен содержать по крайней мере одну альтернативу accept_alternative. Кроме того, он может содержать:
  • альтернативу terminate_alternative (только одну); или
  • одну или несколько альтернатив delay_alternative; или
  • часть else (зарезервированное слово else, за которым следует sequence_of_statements).
Эти три возможности взаимоисключающие.

Правила допустимости

Если оператор selective_accept содержит более одной альтернативы delay_alternative, то все они должны быть операторами delay_relative_statement, или все должны быть операторами delay_until_statement для одного и того же типа времени.

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

Альтернатива select_alternative называется открытой, если она не предшествует оператору guard, или если условие condition оператора guard оценивается как Истина. В противном случае она называется закрытой.
При выполнении оператора selective_accept, все условия guard condition оцениваются; таким образом определяются открытые альтернативы. Для открытой альтернативы delay_alternative также оценивается выражение delay_expression. Аналогично, для открытой альтернативы accept_alternative для входа в семейство также оценивается entry_index. Эти оценки выполняются в произвольном порядке, за исключением того, что выражение delay_expression или entry_index не оцениваются до тех пор, пока не будет оценено соответствующее условие condition, если оно есть.
Затем выбор и выполнение одной открытой альтернативы или части else завершает выполнение оператора selective_accept; правила этого выбора описаны ниже.
Вначале рассматриваются открытые альтернативы accept_alternative. Выбор такой альтернативы происходит немедленно, если соответствующий вход уже имеет очереди вызовов. Если несколько альтернатив могут быть выбраны таким образом, одна из них выбирается в соответствии с политикой очереди ввода, действующей в настоящее время (см. 9.5.3 и D.4). При выборе такой альтернативы выбранный вызов удаляется из очереди входа, и выполняется handled_sequence_of_statements (если таковые имеются) соответствующего оператора accept_statement; после завершения взаимодействия выполняется последующая sequence_of_statements альтернативы. Если немедленный выбор невозможен (в вышеуказанном смысле) и нет части else, задача приостанавливается до тех пор, пока не будет выбрана открытая альтернатива.
Выбор других типов альтернатив или части else выполняется следующим образом:
  • Открытая альтернатива delay_alternative выбирается, когда достигается ее время истечения, если до истечения времени нельзя выбрать альтернативу accept_alternative или другую альтернативу delay_alternative. Если несколько альтернатив delay_alternative имеют одинаковое время истечения, одна из них выбирается в соответствии с действующей политикой очереди (см. D.4); по умолчанию политика очереди произвольно выбирает альтернативу delay_alternative, время истечения которой прошло.
  • Часть else выбирается, и ее sequence_of_statements выполняется, если немедленно нельзя выбрать альтернативу accept_alternative; в частности, если все альтернативы закрыты.
  • Открытая альтернатива terminate_alternative выбирается, если выполняются условия, указанные в конце раздела 9.3.
Исключение Program_Error генерируется, если все альтернативы закрыты и нет части else.
ПРИМЕЧАНИЯ
36 Оператор selective_accept может иметь несколько открытых альтернатив delay_alternative. Оператор selective_accept может иметь несколько открытых альтернатив accept_alternative для одного и того же входа.

Примеры

Пример тела задачи с выбором приема:
task body Server is
Current_Work_Item : Work_Item;
begin
loop
select
accept Next_Work_Item(WI : in Work_Item) do
Current_Work_Item := WI;
end;
Process_Work_Item(Current_Work_Item);
or
accept Shut_Down;
exit; -- Запрошено преждевременное завершение
or
terminate; -- Нормальное завершение в конце области видимости
end select;
end loop;
end Server;


Spec-Zone.ru

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