我需要通过两个不同的任务访问一个任务的两个不同条目。看起来我对Ada的了解不足以执行此操作,我也花了很多时间寻找解决方案,但没有任何影响。我尝试使用受保护的类型作为管理器,但它不起作用。我希望我的访问任务在每个条目中将计数器递增1,然后在计数器达到2后在第一个条目中执行更多的工作。我的方法是这样的
task mainTask is
entry first(n : in Integer);
entry second(n : in Integer);
end mainTask;
task body mainTask is
counter : Integer := 0;
begin
loop
accept first(n : in Integer) do
loop
counter := counter + 1;
Put_Line("First one working");
--loop and wait until counter is 2
--perform rest of the code
delay 1.0;
end loop;
end first;
accept second(n : in Integer) do
loop
counter := counter + 1;
Put_Line("Second one working");
delay 1.0;
end loop;
end second;
end loop;
end mainTask;
task firstTask;
task body firstTask is
begin
mainTask.first(0);
end firstTask;
task secondTask;
task body secondTask is
begin
mainTask.second(0);
end secondTask;
运行firstTask后,访问第一个条目并进入无限循环,第二个条目无法访问第二个条目。我知道它为什么会发生,但我想不出可行的东西。 也许有一些像接受第一(...)和接受第二(...)。 提前谢谢!
答案 0 :(得分:1)
如果你真的想要"一台机器(任务)需要两个工人(工人是一系列任务),你可以同时按下两个不同的按钮,这样机器就可以做一些“,如在您对我的评论的回复,你可以考虑在你的代码中明确这一点;
之类的东西task body Main is
begin
loop
select
accept First_Button_Pressed;
select
accept Second_Button_Pressed;
Put_Line ("second pressed while first pressed");
or
accept First_Button_Released;
Put_Line ("first released");
or
terminate;
end select;
or
accept Second_Button_Pressed;
select
accept First_Button_Pressed;
Put_Line ("first pressed while second pressed");
or
accept Second_Button_Released;
Put_Line ("second released");
or
terminate;
end select;
or
accept First_Button_Released;
Put_Line ("first released");
or
accept Second_Button_Released;
Put_Line ("second released");
or
terminate;
end select;
end loop;
end Main;
但很明显,如果你必须扩展你的代码以处理更多的按钮,这将不容易维护!
答案 1 :(得分:0)
您需要有一个select语句 - 这将允许调用任务选择任何可能打开的选项(第一个,第二个)。 目前你有两个无限循环,所以如果第二次接受发生,我会感到惊讶。
所以...
task multiple_entry is
entry increment;
entry decrement;
end multiple_entry;
task body multiple_entry is
i : integer;
begin
select
accept increment;
i := i + 1;
or
accept decrement do
i := i - 1;
end decrement
or
terminate;
end select;
end;
应该如何构建。