Programación en Ada/Tareas/Llamadas a punto de entrada complejas
Llamadas a punto de entrada complejas editar
A 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_sentencias end 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_sentencias end select ;
Tipos de punto de entrada editar
Como 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 editar
Llama 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 editar
Llama 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 editar
Proporciona 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;