サーチ…
構文
- タスクTask_Name;
- タスクTask_Nameはエントリの終わりです。
- タスク本体Task_NameはDeclarations beginコード終了です。
1つの簡単なタスク
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
task My_Task;
task body My_Task is
begin
Put_Line ("Hello from My_Task");
end;
begin
Put_Line ("Hello from Main");
end;
結果
Put_Lineの順序はさまざまです。
Hello from My_Task
Hello from Main
1つの簡単なタスクと1つのループ
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
task My_Task;
task body My_Task is
begin
for I in 1 .. 4 loop
Put_Line ("Hello from My_Task");
end loop;
end;
begin
Put_Line ("Hello from Main");
end;
結果
Put_Lineの順序はさまざまです。
Hello from My_Task
Hello from Main
Hello from My_Task
Hello from My_Task
Hello from My_Task
1つの簡単なタスクと2つのループ
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
task My_Task;
task body My_Task is
begin
for I in 1 .. 4 loop
Put_Line ("Hello from My_Task");
end loop;
end;
begin
for I in 1 .. 4 loop
Put_Line ("Hello from Main");
end loop;
end;
結果
Put_Lineの順序はさまざまです。
Hello from My_Task
Hello from My_Task
Hello from Main
Hello from My_Task
Hello from Main
Hello from My_Task
Hello from Main
Hello from Main
2つの簡単なタスクと2つのループ
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
task My_Task_1;
task My_Task_2;
task body My_Task_1 is
begin
for I in 1 .. 4 loop
Put_Line ("Hello from My_Task_1");
end loop;
end;
task body My_Task_2 is
begin
for I in 1 .. 4 loop
Put_Line ("Hello from My_Task_2");
end loop;
end;
begin
null;
end;
結果
Put_Lineの順序はさまざまです。
Hello from My_Task_1
Hello from My_Task_1
Hello from My_Task_2
Hello from My_Task_1
Hello from My_Task_2
Hello from My_Task_1
Hello from My_Task_2
Hello from My_Task_2
エントリ後に番号をインクリメントするタスク
ユーザーが呼び出すことができますIncrementor.Increment K内のキーを押して回数を'0' .. '9'し、それが呼び出すことが可能ですIncrementor.Incrementより速くよりtask IncrementorインクリメントすることができI 。
with Ada.Text_IO;
with Ada.Integer_Text_IO;
procedure Main is
use Ada.Text_IO;
task Incrementor is
entry Increment;
end;
task body Incrementor is
use Ada.Integer_Text_IO;
I : Integer := 0;
begin
loop
accept Increment;
I := I + 1;
Put (I, 0);
delay 0.1;
end loop;
end;
K : Character;
begin
loop
Get_Immediate (K);
if K in '0' .. '9' then
for I in 1 .. Natural'Value (K & "") loop
Incrementor.Increment;
end loop;
end if;
end loop;
end;
割り込み処理
割り込みは、パラメータなしの保護されたプロシージャによって処理されます。
------------------------------------------------------------------
-- Interrupt Counting Package --
------------------------------------------------------------------
with Ada.Interrupts.Names; use Ada.Interrupts.Names;
package Ctl_C_Handling is
protected CTL_C_Handler is
procedure Handle_Int with
Interrupt_Handler,
Attach_Handler => SIGINT;
entry Wait_For_Int;
private
Pending_Int_Count : Natural := 0;
end Ctl_C_Handler;
task CTL_Reporter is
entry Stop;
end CTL_Reporter;
end Ctl_C_Handling;
パッケージ本体には、保護されたプロシージャがどのように動作するかが示されますこの場合、割り込みは処理されるよりも速く到着するため、ブール値は保護オブジェクトで使用されません。タスクCTL_Reporterは、受信した割り込みを処理します。
with Ada.Text_IO; use Ada.Text_IO;
with Ctl_C_Handling; use CTL_C_Handling;
with Ada.Calendar; use Ada.Calendar;
package body Ctl_C_Handling is
-------------------
-- CTL_C_Handler --
-------------------
protected body CTL_C_Handler is
----------------
-- Handle_Int --
----------------
procedure Handle_Int is
begin
Pending_Int_Count := Pending_Int_Count + 1;
end Handle_Int;
------------------
-- Wait_For_Int --
------------------
entry Wait_For_Int when Pending_Int_Count > 0 is
begin
Pending_Int_Count := Pending_Int_Count - 1;
end Wait_For_Int;
end CTL_C_Handler;
------------------
-- CTL_Reporter --
------------------
task body CTL_Reporter is
type Second_Bin is mod 10;
type History is array(Second_Bin) of Natural;
---------------------
-- Display_History --
---------------------
procedure Display_History(Item : History) is
Sum : Natural := 0;
begin
for I in Item'Range loop
Put_Line("Second: " & Second_Bin'Image(I) & " :" & Natural'Image(Item(I)));
Sum := Sum + Item(I);
end loop;
Put_Line("Total count: " & Natural'Image(Sum));
New_Line(2);
end Display_History;
One_Second_Count : Natural := 0;
Next_Slot : Second_Bin := 0;
Next_Second : Time := Clock + 1.0;
Ten_Second_History : History := (Others => 0);
begin
loop
Select
Accept Stop;
exit;
else
select
CTL_C_Handler.Wait_For_Int;
One_Second_Count := One_Second_Count + 1;
or
delay until Next_Second;
Next_Second := Next_Second + 1.0;
Ten_Second_History(Next_Slot) := One_Second_Count;
Display_History(Ten_Second_History);
Next_Slot := Next_Slot + 1;
One_Second_Count := 0;
end Select;
end Select;
end loop;
end CTL_Reporter;
end Ctl_C_Handling;
このパッケージを実行する主なプログラムの例は次のとおりです。
------------------------------------------------------------------
-- Ada2012 Interrupt Handler Example --
------------------------------------------------------------------
with Ada.Text_IO; use Ada.Text_IO;
with Ctl_C_Handling; use CTL_C_Handling;
procedure Interrupt01 is
begin
Delay 40.0;
CTL_Reporter.Stop;
Put_Line("Program ended.");
end Interrupt01;
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow