我在Ada中得到了TASKING_ERROR的提示。

问题描述 投票:0回答:1

我是一个新的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
exception task ada
1个回答
3
投票
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;

1
投票

@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;

0
投票

只是补充一下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;
© www.soinside.com 2019 - 2024. All rights reserved.