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$