我是一个新的Ada,我刚刚得到一个任务,做在Ada任务程序,当我试图运行一个程序在Ada和我得到 "提出TASKING_ERROR",而我在一个在线编译器运行在这里。https:/www.tutorialspoint.comcompile_ada_online.php.
with Ada.Text_IO;
use Ada.Text_IO;
procedure ConTasks is
task type SimpleTask (Message: Character; HowMany:Positive) is
entry Start_Running;
end SimpleTask;
task body SimpleTask is
begin
for i in 1 .. HowMany loop
delay 0.1;
Ada.Text_IO.Put_Line("Hello from task "&Message);
end loop;
end SimpleTask;
task_a : SimpleTask('A', 5);
task_b : SimpleTask('B', 7);
task_c : SimpleTask('C', 4);
begin
task_a.Start_Running;
task_b.Start_Running;
task_c.Start_Running;
end ConTasks;
但是当我在MinGW中运行同样的程序时,我得到了以下的错误信息。
C:\MinGW\bin>gcc -c Ada\ConTasks.ada
gcc: warning: Ada\ConTasks.ada: linker input file unused because linking not done
在在线编译器中,我得到了正确的输出,但最后,它显示了以下错误。
Hello from task B
Hello from task A
.
.
Hello from task B
raised TASKING_ERROR
with Ada.Text_IO;
use Ada.Text_IO;
procedure ConTasks is
task type SimpleTask (Message: Character; HowMany:Positive);
task body SimpleTask is
begin
for i in 1 .. HowMany loop
delay 0.1;
Ada.Text_IO.Put_Line("Hello from task "&Message);
end loop;
end SimpleTask;
task_a : SimpleTask('A', 5);
task_b : SimpleTask('B', 7);
task_c : SimpleTask('C', 4);
begin
null;
end ConTasks;
@Rudra Lad的回答几乎是正确的,它的问题在于,通过将循环封闭起来,用 accept
整个过程都是在会合点内完成的,也就是说。Task
和调用任务都参与其中,所以你没有利用任何并行性和并发性。
with Ada.Text_IO;
use Ada.Text_IO;
procedure ConTasks is
task type SimpleTask (Message: Character; HowMany:Positive) is
entry Start_Running;
end SimpleTask;
task body SimpleTask is
begin
accept Start_Running do
null;
end Start_Running;
for i in 1 .. HowMany loop
delay 0.1;
Ada.Text_IO.Put_Line("Hello from task "&Message);
end loop;
end SimpleTask;
task_a : SimpleTask('A', 5);
task_b : SimpleTask('B', 7);
task_c : SimpleTask('C', 4);
begin
task_a.Start_Running;
task_b.Start_Running;
task_c.Start_Running;
end ConTasks;
只是补充一下Jim的答案,如果你想控制单个任务何时开始,你可以使用条目。
这将使你对你的任务有更多的控制。因为,没有任何条目的任务在你执行二进制时就开始执行。
with Ada.Text_IO;
use Ada.Text_IO;
procedure ConTasks is
task type SimpleTask (Message: Character; HowMany:Positive) is
entry Start_Running;
end SimpleTask;
task body SimpleTask is
begin
accept Start_Running do
for i in 1 .. HowMany loop
delay 0.1;
Ada.Text_IO.Put_Line("Hello from task "&Message);
end loop;
end Start_Running;
end SimpleTask;
task_a : SimpleTask('A', 5);
task_b : SimpleTask('B', 7);
task_c : SimpleTask('C', 4);
begin
task_a.Start_Running;
delay 2.0;
task_b.Start_Running;
delay 2.0;
task_c.Start_Running;
end ConTasks;