我是Ada的新手,我正在尝试编写一个简单的程序,但我遇到了一些我无法解决的问题。所以我有一个执行条目和一个signalfound条目的任务,首先调用执行条目,并且必须进行一些计算,直到主信号调用signalfound条目然后它必须停止。
但问题是,当调用Signalfound条目时,它不会被执行,因为任务停留在while循环中。在Ada中是否有明显的解决方案。我试过谷歌搜索问题,但没有成功。提前谢谢!
task Example body
ResultFound : Boolean := False;
--- other unimportant things
begin
loop
select
accept Execute do
while (ResultFound = False) loop
---do some calculations
end loop;
end Execute;
or
accept SignalFound do
ResultFound := True;
end SignalFound;
or
-- other unimportant accepts
end select;
end loop;
end Example;
答案 0 :(得分:3)
好吧,当调用Execute
时,您的任务进入循环,这意味着它再也不会执行 select
语句,因此它永远不会接受{{1调用。此外,调用SignalFound
的实体永远不会继续,因为您的while循环会在 Execute
语句中 。通常,您希望尽可能减小任务同步的关键区域,以便在交换必要的数据后,这两个任务都可以继续工作。
请注意,您的代码反映了您的任务运行的协议。目前,您的代码显示“我将在任何循环迭代”接受accept
和Execute
,这似乎与您根据什么考虑的协议不符你写的。
我相信你真正想做的事情是这样的:
SignalFound
此代码强制执行一系列交替的task Example body
begin
loop
-- simply wait for someone to tell me to execute.
accept Execute;
Calculations : loop
-- check at every loop iteration whether there's a SignalFound waiting
select
accept SignalFound;
exit Calculations;
else
-- do some calculations
end select;
end loop Calculations;
-- will go to next iteration and wait for someone to call Execute again.
end loop;
end Example;
/ Execute
调用,这似乎是您的想法。