использования задачи
В следующем примере определена задача буферизации для сглаживания различий между скоростью ввода производящей задачи и скоростью ввода некоторой потребляющей задачи. Например, производящая задача может содержать операторы:
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.
СТРУКТУРА ПРОГРАММЫ И РЕЗУЛЬТАТ КОМПИЛЯЦИИ |