10. Parallele Prozesse
 
zurück
10.5 Die Verzögerungsanweisung


Ein Prozeß kann entscheiden, ob er für eine bestimmte Zeitdauer seine Aktivität suspendieren will. Dazu stellt Ada die Verzögerungsanweisung (delay_statement <BNF>) bereit.

Die Verzögerungsanweisung bewirkt, daß die weitere Ausführung des Prozesses, der die Verzögerungsanweisung ausführt, mindestens so lange unterbrochen wird, wie der betreffende Parameter angibt. Dabei wird unterschieden zwischen relativen und absoluten Zeitangaben.

delay 1.3; -- mindestens 1,3 Sekunden Suspendierung.


Diese Anweisung veranlaßt, daß dem Prozeß für mindestens 1,3 Sekunden die Prozessorkapazität entzogen wird. Der Prozeß ist blockiert.

Von der Verzögerungsanweisung wird der vordefinierte Typ "duration" akzeptiert.

...
   minute : constant duration := 60.0;
begin
   delay 2 * minute; -- Warte zwei Minuten.
...


Wichtig ist, daß mindestens die angebene Zeit gewartet wird. Allerdings gibt Ada keine Zusicherung dazu, wann nach Ablauf dieser Zeit der Prozeß wieder aktiv wird.

Die Verzögerungsanweisung kann benutzt werden, um einen kooperativen Prozeßwechsel zu initiieren. Da der Prozeß automatisch in den Zustand blockiert übergeht, bekommt das Zuteilungsverfahren die Möglichkeit, eventuell einem anderen Prozeß die Prozessorkapazität zuzuteilen.

loop
   --...
   delay 0.001; -- Prozeß wird blockiert.
   -- Einige Übersetzer blockieren auch dann, wenn man
   -- delay 0.0 verwendet.
end loop;


Ein Prozeß in einer Endlosschleife initiiert nach jedem Durchlauf einen Prozeßwechsel.

Für die Verzögerung mit absoluter Zeitangabe erwartet die Verzögerungsanweisung einen Parameter vom Typ "time", der im Paket "Ada.Calendar" definiert ist. Dieses Paket enthält die notwendigen Prozeduren zum Berechnen von Zeitpunkten und von Zeitdauern.

Duration ist ein vordefinierter Festpunkttyp zum Darstellen von Zeitdauern, während Time ein privater Datentyp zum Darstellen von Zeitpunkten ist. Auf Time sind diverse Unterprogramme und Operatoren definiert.

   ...
   eine_stunde : constant duration := 3600.00;
   naechster_zeitpunkt : time := calendar.clock; -- Uhrzeit

begin
   loop
      naechster_zeitpunkt := nächster_zeitpunkt + eine_stunde;
      -- ...
      delay until nächster_zeitpunkt;
   end loop;
end;


Zwischen jedem Durchlauf wird bis zu dem nächsten Zeitpunkt gewartet. Hier gilt wieder, daß mindestens bis zu dem angegebenen Zeitpunkt gewartet wird, aber ohne Zusicherung, daß der Prozeß den Prozessor erhält, wenn der Zeitpunkt überschritten ist.


 
zurück
 Index   Ada Tour - Dokumentation  
© 2003 Förderverein Ada Deutschland e.V.