Programación en Ada/Tareas/Llamadas a punto de entrada complejas
Llamadas a punto de entrada complejas
editarA veces, interesa que una llamada a un punto de entrada de una tarea cumpla unos requisitos. Esto es debido a que se puede bloquear el proceso que realiza la llamada y puede ser interesante disponer de métodos para desbloquearlo si no se cumplen unas determinadas condiciones.
La sentencia select, además de servir como selección de aceptaciones de puntos de entrada dentro del cuerpo de la tarea que los contiene, también proporciona mecanismos para seleccionar el comportamiento de las llamadas a puntos de entrada. Su sintaxis es la siguiente:
llamada_a_punto_de_entrada_compleja ::= llamada_a_punto_de_entrada_con_tiempo_límite | llamada_a_punto_de_entrada_condicional | llamada_a_punto_de_entrada_asíncrona llamada_a_punto_de_entrada_con_tiempo_límite ::=select
identif_p_entrada [ ( tipo | rango ) ] [ ( parámetro { , parámetro } ) ] ; [ secuencia_de_sentencias ]or
delay
[until
] expresión ; [ secuencia_de_sentencias ]end
select
; llamada_a_punto_de_entrada_condicional ::=select
identif_p_entrada [ ( tipo | rango ) ] [ ( parámetro { , parámetro } ) ] ; [ secuencia_de_sentencias ]else
secuencia_de_sentenciasend
select
; llamada_a_punto_de_entrada_asíncrona ::=select
( identif_p_entrada [ ( tipo | rango ) ] [ ( parámetro { , parámetro } ) ] ; ) | (delay
[until
] expresión ; ) [ secuencia_de_sentencias ]then
abort
secuencia_de_sentenciasend
select
;
Tipos de punto de entrada
editarComo puede apreciarse, hay tres posibles llamadas a puntos de entrada a parte de la simple, éstas son: llamada con tiempo límite, llamada condicional y transferencia asíncrona.
Llamada con tiempo límite
editarLlama a un punto de entrada que es cancelado si no se produce la aceptación antes de que finalice un plazo de tiempo. Ejemplo:
select
Controlador.Petición (Medio) (Elem);or
delay
50.0; Put ("Controlador demasiado ocupado.");end
select
;
Llamada condicional
editarLlama a un punto de entrada que es cancelada si no es aceptada inmediatamente, es decir, tiene un tiempo límite nulo. Ejemplo:
select
Procesado.Aviso;else
raise
Error;end
select
;
Transferencia asíncrona
editarProporciona la transferencia asíncrona de control cuando se acepte la llamada a un punto de entrada o se cumpla un plazo de tiempo, mientras se esté ejecutando una secuencia de sentencias. Es decir, si se acepta la llamada al punto de entrada o cumple el plazo, se abortan las sentencias que se estuvieran ejecutando. Ejemplo:
select
delay
5.0;raise
FunciónNoConverge;then
abort
Función_recursiva (X, Y);end
select
;