home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 349_01 / sss.arc / EX_0805.PAS < prev    next >
Pascal/Delphi Source File  |  1991-04-10  |  2KB  |  105 lines

  1. Program EX_0805;
  2. {Listing 17P - see documentation in TUTOR.SSS}
  3.  
  4. uses SSS, crt;
  5. { For Pascal other than Turbo/Quick erase above line }
  6.  
  7. const
  8.   ARRIVL = 1;
  9.   STARTA = 2;
  10.   ENDACT = 3;
  11.   NEXTAC = 4;
  12.   REPORT = 5;
  13.  
  14.   REPTME = -1;
  15.   TIMEL  = 120;
  16.   SSIZE  = 4;
  17.  
  18. { For MS Pascal $include:'SSSP1.H' }
  19.  
  20. var
  21.   n, countr, server, ecode : integer;
  22.  
  23. { For MS Pascal $include:'SSSP2.H' }
  24.  
  25. procedure signal(s:string; v: real; w,d: integer);
  26. var x, y: integer;
  27. begin
  28.   x := wherex;
  29.   y := wherey;
  30.   clreol;
  31.   write(s,v:w:d);
  32.   gotoxy(x,y);
  33. end;
  34.  
  35. procedure prime;
  36. begin
  37.   n := 0;
  38.   countr := 0;
  39.   server := 1;
  40.   INIQUE(1,1,1);
  41.   INISTA(1,'bus',1,0,0,0);
  42.   TALLY(1,server);
  43.   CREATE(0, n);
  44.   CREATE(TIMEL, REPTME);
  45. end;
  46.  
  47. begin
  48.  
  49.   prime;
  50.  
  51.   repeat
  52.     ecode := NEXTEV;
  53.     if ecode > 0 then
  54.     begin
  55.       case ecode of
  56.  
  57.       ARRIVL: if IDE = REPTME then
  58.                 SCHED(0, REPORT, IDE)
  59.               else
  60.               begin
  61.                 n := n + 1;
  62.                 signal('Simulated time: ',T,7,2);
  63.                 SETA(1, EX(0.9));
  64.                 CREATE(EX(1), n);
  65.                 SCHED(0, NEXTAC, IDE);
  66.               end;
  67.  
  68.       NEXTAC: if server > 0 then SCHED(0, STARTA, IDE)
  69.               else               QUEUE(1, 0);
  70.  
  71.       STARTA: begin
  72.                  SCHED(A(1), ENDACT, IDE);
  73.                  server := server - 1;
  74.                  TALLY(1,server);
  75.               end;
  76.  
  77.       ENDACT: begin
  78.                 DISPOS;
  79.                 server := server + 1;
  80.                 TALLY(1,server);
  81.                 if NQ(1) > 0 then
  82.                 begin
  83.                   REMVFQ(1,1);
  84.                   SCHED(0, STARTA, IDE);
  85.                 end;
  86.               end;
  87.  
  88.       REPORT: begin
  89.                 SCHED(TIMEL, REPORT, IDE);
  90.                 if countr = 0 then
  91.                   writeln('# average avail.s            ')
  92.                 else
  93.                   writeln(countr:1,QAVG(1):8:1,
  94.                     SAVG(1):8:3,'               ');
  95.                 CLEARQ(1);
  96.                 CLEARS(0);
  97.                 countr := countr + 1;
  98.                 if countr > SSIZE then SIMEND(0);
  99.               end;
  100.       end;
  101.     end;
  102.   until ecode = 0;
  103.  
  104. end.
  105.