Programación en Ada/Tareas/Llamadas a punto de entrada complejas

De Wikilibros, la colección de libros de texto de contenido libre.
← Tareas/Selección de citas Llamadas a punto de entrada complejas Tareas/Dinámicas →


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;

Manual de referencia de Ada[editar]