Programación en Ada/Tareas/Llamadas a punto de entrada complejas
De Wikilibros, la colección de libros de texto de contenido libre.
Contenido |
[editar] Llamadas a punto de entrada complejas
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;
[editar] Tipos de punto de entrada
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.
[editar] Llamada con tiempo límite
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;
[editar] Llamada condicional
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;
[editar] Transferencia asíncrona
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;