Advertisement
ichramm

propuestaSolucionB1.adb

Jun 6th, 2020
5,043
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 1.93 KB | None | 0 0
  1.  
  2. personasEnLab: Mailbox; -- contador
  3. mayores65Esperando: Mailbox; -- contador
  4. menores65Esperando: Mailbox; -- contador
  5. entraMayor65: Mailbox; -- habilita entrada de mayor de 65
  6. entraMenor65: Mailbox; -- habilita entrada de menor de 65
  7. consultoriosLibres: Mailbox; -- contiene los consultorios libres
  8. pancienteEnConsultorio: Mailbox; -- despierta medico cuando entra paciente a consultorio
  9. busMedico: array (1..3) of Mailbox; -- comunicacion medico-paciente
  10. busConsultorio: array (1..2) of Mailbox; -- comunicacion dentro del consultorio
  11.  
  12. procedure Main()
  13. begin
  14.     send(personasEnLab, 0);
  15.     for i in (1..2) loop
  16.         send(consultoriosLibres, i);
  17.     end loop;
  18.     enviar(mayores65Esperando, 0);
  19.     enviar(colaMenoresEsperando, 0);
  20. end Main;
  21.  
  22. procedure Persona()
  23.     edad : Integer;
  24.     count, esperando : Integer;
  25.     consultorio, idMedico: Integer;
  26. begin
  27.     edad := obtener_edad();
  28.  
  29.     count := recibir(personasEnLab);
  30.     if count >= 5 then
  31.         enviar(personasEnLab, count);
  32.         if edad >= 65 then
  33.             esperando := recibir(mayores65Esperando);
  34.             enviar(mayores65Esperando, esperando + 1);
  35.             recibir(entraMayor65);
  36.         else
  37.             esperando := recibir(menores65Esperando);
  38.             enviar(menores65Esperando, esperando + 1);
  39.             recibir(entraMenor65);
  40.         end if
  41.         count := recibir(personasEnLab);
  42.     end if;
  43.  
  44.     enviar(personasEnLab, count + 1);
  45.  
  46.     consultorio = recibir(consultoriosLibres);
  47.     entrar_consultorio(consultorio)
  48.  
  49.     -- pido un medico
  50.     enviar(pancienteEnConsultorio,  consultorio);
  51.  
  52.     -- aca entra el medico (y toma la muestra ya que estamos)
  53.     idMedico := recibir(busConsultorio(consultorio));
  54.  
  55.     -- al salir del consultorio hay que marcarlo como libre
  56.     salir_consultorio(consultorio);
  57.     enviar(consultoriosLibres, consultorio);
  58.  
  59.     -- espera a que medico termine analisis, y diga a que consultorio ir
  60.     consultorio := recibir(busMedico);
  61.     entrar_consultorio(consultorio);
  62.  
  63.     -- habilita al medico a entregar el informe
  64.     enviar(busConsultorio(consultorio), NIL);
  65.  
  66.     -- ya notificado, se puede ir, aca podia usar busMedico y andaba igual
  67.     recibir(busConsultorio(consultorio));
  68.  
  69.     salir_consultorio(consultorio)
  70.     enviar(consultoriosLibres, consultorio);
  71.  
  72.     -- salida del lab
  73.     count := recibir(personasEnLab);
  74.     if count <= 5 then
  75.         -- puede entrar alguien mas, mayores de 65 tienen prioridad
  76.         esperando := recibir(mayores65Esperando);
  77.         if esperando > 0 then
  78.             enviar(entraMayor65, NIL);
  79.             enviar(mayores65Esperando, esperando - 1);
  80.         else
  81.             enviar(mayores65Esperando, 0);
  82.             esperando := recibir(menores65Esperando);
  83.             if esperando > 0 then
  84.                 enviar(entraMenor65, NIL);
  85.                 enviar(menores65Esperando, esperando - 1);
  86.             else
  87.                 enviar(menores65Esperando, 0);
  88.             end if;
  89.         end if;
  90.     end if;
  91.     enviar(personasEnLab, count - 1);
  92. end Persona;
  93.  
  94. procedure Medico(id: Integer)
  95.     m: muestra;
  96.     r: boolean;
  97. begin
  98.     loop
  99.         consultorio = recibir(pancienteEnConsultorio);
  100.  
  101.       -- entrar_consultorio
  102.         m := tomar_muestra();
  103.         enviar(busConsultorio(consultorio), id); -- id del medico
  104.       -- salir_consultorio
  105.  
  106.         r := analizar(); -- en el lab
  107.  
  108.         consultorio = recibir(consultoriosLibres);
  109.       -- entrar_consultorio
  110.         -- paciente espera por el resultado en la cola del medico
  111.         enviar(busMedico(i), consultorio); -- notificar al paciente
  112.         -- notar que podia usar busMedico, pero ya que estan los dos en el
  113.         -- consultorio es mejor mantener la consistencia
  114.         recibir(busConsultorio(consultorio)); -- esperar a que el paciente entre
  115.         informar_resultado(r)
  116.         enviar(busConsultorio(i), NIL); -- se pude ir
  117.       -- salir_consultorio
  118.     end loop;
  119. end Medico;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement