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 ::=selectidentif_p_entrada [ ( tipo | rango ) ] [ ( parámetro { , parámetro } ) ] ; [ secuencia_de_sentencias ]ordelay[until] expresión ; [ secuencia_de_sentencias ]endselect; llamada_a_punto_de_entrada_condicional ::=selectidentif_p_entrada [ ( tipo | rango ) ] [ ( parámetro { , parámetro } ) ] ; [ secuencia_de_sentencias ]elsesecuencia_de_sentenciasendselect; llamada_a_punto_de_entrada_asíncrona ::=select( identif_p_entrada [ ( tipo | rango ) ] [ ( parámetro { , parámetro } ) ] ; ) | (delay[until] expresión ; ) [ secuencia_de_sentencias ]thenabortsecuencia_de_sentenciasendselect;
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:
selectControlador.Petición (Medio) (Elem);ordelay50.0; Put ("Controlador demasiado ocupado.");endselect;
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:
selectProcesado.Aviso;elseraiseError;endselect;
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:
selectdelay5.0;raiseFunciónNoConverge;thenabortFunción_recursiva (X, Y);endselect;