Ада-95. Компилятор GNAT

       

Типы и объекты задач


Конструкция задачи обладает свойствами, которые характерны для пакетов, процедур и структур данных:

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

Вместо этого, задача должна быть помещена в другую структуру (например, пакет или процедуру)

Подобно процедуре, задача содержит раздел описаний и исполнительную часть, однако она не вызывается как процедура.

Вместо этого, она начинает выполняться автоматически, как часть структуры, в которой она описана.

  • Подобно структуре данных, задача имеет тип и может существовать как переменная этого типа. Кроме того, подобно записи, задача может иметь дискриминанты.

    Спецификация задачи, начинающаяся зарезервированными словами task type, определяет тип задачи (или задачный тип). Значение объекта (переменная) типа задачи представляет собой задачу.

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

    Простым примером многозадачной программы может служить следующая программа:

    with Ada.Text_IO;

    procedure Multitasking_Demo is

    -- спецификация анонимной задачи task Anonimous_Task;



    -- тело анонимной задачи task body Anonimous_Task is

    begin -- для Anonimous_Task

    for Count in 1..5 loop

    Ada.Text_IO.Put_Line("Hello from Anonimous_Task"); end loop;

    end Anonimous_Task;

    -- спецификация типа задачи task type Simple_Task (Message: Character);

    -- тип задачи имеет тело task body Simple_Task is

    begin -- для Simple_Task

    for Count in 1..5 loop

    Ada.Text_IO.Put_Line("Hello from Simple_Task " & Message); end loop;

    end Simple_Task;

    -- переменная задачного типа Simple_Task_Variable: Simple_Task(Message => 'A');

    begin -- для Multitasking_Demo

    -- в отличие от процедур, задачи не вызываются, -- а активируются автоматически

    -- выполнение обоих задач начинается как только -- управление достигнет этой точки, то есть, сразу -- после "begin", но перед выполнением первой инструкции -- головной процедуры Multitasking_Demo

    null;

    end Multitasking_Demo;

    <


    В данном примере описана одиночная задача анонимного типа Anonimous_Task, тип задачи Simple_Task и переменная задачи Simple_Task_Variable, имеющая тип Simple_Task.

    Примечательно, что описание типа задачи Simple_Task содержит дискриминант, значение которого используется как параметр задачи и указывается при описании переменной задачи Simple_Task_Variable.

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

    Алгоритмы работы обоих задач просты и подобны - каждая задача выводит пять приветственных сообщений и завершает свою работу.

    Рассмотрим еще один простой пример, который демонстрирует использование задачного типа для описания более одного экземпляра объекта задачи.

    with Ada.Text_IO;

    procedure Multitasking_Demo_2 is

    -- спецификация типа задачи task type Simple_Task (Message: Character; How_Many: Positive);

    -- тело типа задачи task body Simple_Task is

    begin -- для Simple_Task

    for Count in 1..How_Many loop

    Ada.Text_IO.Put_Line("Hello from Simple_Task " & Message); delay 0.1; end loop;

    end Simple_Task;

    -- переменные задачного типа Simple_Task_A: Simple_Task(Message => 'A', How_Many => 5); Simple_Task_B: Simple_Task(Message => 'B', How_Many => 10);

    begin -- для Multitasking_Demo_2

    null;

    end Multitasking_Demo_2;

    В этом примере, тип задачи Simple_Task содержит два дискриминанта: дискриминант Message типа Character используется при выдаче приветственного сообщения, как и ранее, а дискриминант How_Many используется для указания количества выдаваемых сообщений.

    Таким образом, переменная задачи Simple_Task_A

    выдаст пять приветствий, а переменная Simple_Task_B - десять.


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