Справочное руководство по языку Ада-83

использования задачи


В следующем примере определена задача буферизации для сглаживания различий между скоростью ввода производящей задачи и скоростью ввода некоторой потребляющей задачи. Например, производящая задача может содержать операторы:

loop

-— выработка следующего символа CHAR BUFFER.WRITE(CHAR); exit when CHAR = ASCII.EOT; end loop;

потребляющая задача — операторы:

loop

BUFFER.READ(CHAR); -— использование символаСНАР

exit when CHAR = ASCII.EOT; end loop;

Задача буферизации содержит внутренний пул для символов, обрабатываемых цикличес-ки. Пул имеет два индекса: IN-INDEX, указывающий место следующего вводимого символа, и OUT_INDEX, указывающий место следующего выводимого символа.

task BUFFER is

entry READ (С : out CHARACTER); entry WRITE (C : in CHARACTER); end:

task body BUFFER is

POOL_SIZE : constant INTEGER := 100: POOL : array(1 .. POOL_SIZE) of CHARACTER; COUNT : INTEGER range 0 .. POOL_SIZE := 0; IN_INDEX, OUT_INDEX : INTEGER range 1 .. POOL_SIZE := 1; begin

loop



select

when COUNT < POOL_SIZE => accept WRITE(C : in CHARACTER) do

POOL(IN_INDEX) := C; end; IN_INDEX := IN_INDEX mod POOL_SIZE + 1; COUNT := COUNT + 1; or when COUNT > 0 => accept READ(C ; out CHARACTER) do

C := POOL(OUT_INDEX); end; OUT_INDEX := OUT_INDEX mod POOL_SIZE + 1; COUNT := COUNT - 1; or

terminate;

end select:

end loop:

end BUFFER;

Пред.  Уровень выше  След.

9.11. РАЗДЕЛЯЕМЫЕ ПЕРЕМЕННЫЕ

 

Содержание  Глава 10.

СТРУКТУРА ПРОГРАММЫ И РЕЗУЛЬТАТ КОМПИЛЯЦИИ



Содержание раздела