next up previous
Next: Rendezvous Up: Sprachmittel zur Synchronisierung Previous: Scheduling

Ein einfaches Beispiel mit globalen Bedingungen

Das folgende Programm[*] zeigt wie einfach es ist, eine Koroutine auf ein globales Ereignis warten zu lassen. Als globales Ereignis tritt hier das Eintreffen einer bestimmten Uhrzeit auf. Das Programm liest von der Eingabe eine Reihe von Zeiten (die relativ zur aktuellen Zeit in Sekunden angegeben werden) und zugehörige Texte, kreiert für jedes dieser Paare eine Koroutine, die dann darauf wartet, daß diese Zeit eintritt, um dann den entsprechenden Text auszugeben.

Durch die Eingabe eines Buchstaben wird die Einleseschleife und damit die ``Haupt-Koroutine'' beendet. Damit endet aber noch nicht das Programm, da hierfür erst alle dem Scheduler bekannten Koroutinen terminieren müssen.

MODULE Sleep;

   IMPORT Clocks, Conditions, Coroutines, Read, Streams, SYS := SYSTEM,
      Tasks, TimeConditions, Times, Write;

   PROCEDURE PrintMessage(VAR cr: Coroutines.Coroutine;
                          seconds: INTEGER;
                          message: ARRAY OF CHAR);
      (* create a coroutine which prints `message' after `seconds' seconds *)
      VAR
         timeCond: Conditions.Condition;
         time: Times.Time;
   BEGIN
      SYS.CRSPAWN(cr);
      Times.CreateAndSet(time, Times.relative, 0, seconds, 0);
      TimeConditions.Create(timeCond, Clocks.system, time);
      Tasks.WaitFor(timeCond);
      Write.LineS(Streams.stderr, message);
      Tasks.Terminate;
   END PrintMessage;

   PROCEDURE Cmds;
      VAR
         seconds: INTEGER;
         message: ARRAY 80 OF CHAR;
         cr: Coroutines.Coroutine; task: Tasks.Task;
   BEGIN
      LOOP
         Write.String(": ");
         Read.Int(seconds);
         IF Streams.stdin.count = 0 THEN EXIT END;
         Read.Line(message);
         PrintMessage(cr, seconds, message); Tasks.Create(task, cr);
      END;
      Write.Line("Main loop terminates...");
   END Cmds;

BEGIN
   Cmds;
END Sleep.

So könnte dann ein beispielhafter Verlauf aussehen:

belinda$ tsleep
: 20 Hi Adi
: 10 etwas schneller
: 25 Schluss!
: x
Main loop terminates...
 etwas schneller
 Hi Adi
 Schluss!
belinda$


Andreas Borchert
2/2/1998