Task Tren is estacion_actual : integer; cant_pasajeros : integer; indeterminados : integer; pasajeros_subieron : integer; timeout : boolean; actualizar_hora : boolean; cola_espera : array [1..8] of integer; baja_pasajero : array [1..8] of entry; sube_pasajero : array [1..8] of entry; End Tren; Task body Tren is estacion_actual = 1; indeterminados = cant_pasajeros = pasajeros_subieron = 0; ultima_subida_bajada_hora = tiempo(); timeout = false; actualizar_hora = true; for i in range(1, 8) do cola_espera[i] = 0; end for; loop if actualizar_hora then actualizar_hora = false; ultima_subida_bajada_hora = tiempo(); end if select accept baja_pasajero[estacion_actual]; cant_pasajeros--; cola_espera[estacion_actual]--; actualizar_hora = true; or when [cant_pasajeros < 50] => accept sube_pasajero[estacion_actual]; cant_pasajeros++; indeterminados++; pasajeros_subieron++; actualizar_hora = true; or accept bajo_en_estacion(in: estacion_pasajero); cola_espera[estacion_pasajero]++; indeterminados--; actualizar_hora = false; or delay (max(0, 15 - (tiempo() - ultima_subida_bajada_hora))) --son 15 segs menos el tiempo que ya voy esperando timeout = true; end select if (timeout || indeterminados == 0 && cola_espera[estacion_actual] == 0) then molinete[estacion_actual].retira_tren(pasajeros_subieron); timeout = actualizar_hora = false; pasajeros_subieron = 0; estacion_actual = (estacion_actual mod 8)++; --hago el mod antes de sumar porque se empieza a contar desde el 1 cambiar_estacion(); end if; end loop End Tren; Task type Inspector is inspec_pasajero : entry; End Inspector; Task type Inspector body is loop accept inspec_pasajero do inspeccionar() end inspec_pasajero; end loop End Inspector; Task type Molinete is cant_personas : integer; llega_tren : entry; retira_tren : entry; llega_pasajero : entry; End Molinete Task body Molinete is cant_personas = 0; loop select accept llega_tren do accept retira_tren(in: cant_personas_subieron) do cant_personas -= cant_personas_subieron end retira_tren end llega_tren or when [cant_personas < 60 and llega_tren'count == 0] => accept llega_pasajero cant_personas++; end select; end loop End Molinete Task Pasajero is eOrigen : integer; eDestino : integer; ins : integer; End Pasajero Task body Pasajero is eOrigen = vidaAntesDeViajar(); molinete[eOrigen].llega_pasajero(); tren.sube_pasajero[eOrigen]; eDestino = destino(); tren.bajo_en_estacion(eDestino); tren.baja_pasajero(); ins = boton(); if (ins != 0) then inspector[eDestino][ins].inspec_pasajero(); end if End Pasajero inspector array[1..8] of array [1..7] of Inspector; molinete array[1..8] of Molinete;