混合录入电话并接受Ada中的选择?

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

是否可以在一个select语句中混合受保护的入口调用(带屏障)和accept?不使用延迟和两个不同的连续选择,一个用于接受,一个用于条目呼叫:

task body Task is
begin
  select
    accept Get;
  or
    accept Put;
  or
    Protected_Object.Alive;
  end select;
end Task;

protected body Protected_Object is
begin
  entry Alive when Is_Alive is
  ...

我希望Task被锁定,等待调用Get,Put或者在Alive中打开障碍。

ada
2个回答
3
投票

以下是一些替代方案,具体取决于您期望更频繁发生的事情:

如果您希望/希望Get / Put比Alive更频繁地发生:

task body Test is
begin
    loop
        select
            accept Get;
        or
            accept Put;
        or 
            -- Pick a value that makes sense
            -- This is how long you check Get
            -- and Put before trying Alive
            delay 0.0001;  

            -- Asynchronous transfer of control
            -- will try Protected_Object.Alive
            -- until the second delay is finished
            select
                -- Pick a value that makes sense
                -- Should be much smaller than the above
                -- delay
                delay 0.0000001;  
            then abort
                Protected_Object.Alive;
            end select;

        end select;

    end loop;
end Test;

如果您希望/希望Alive比Get / Put更频繁地检查,那么:

task body Test is
begin
    loop
        select
            accept Get;
        or
            accept Put;
        else

            -- Asynchronous transfer of control
            -- will try Protected_Object.Alive
            -- until the delay is finished
            select
                -- Pick a value that makes sense
                delay 0.0001;  
            then abort
                Protected_Object.Alive;
            end select;

        end select;

    end loop;
end Test;

无论哪种方式,如果需要,您需要决定如何/何时结束该循环。


0
投票

请注意,您可以这样做:

select
   Protected_Object.Alive;
then abort
   select
      accept Get;
   or
      accept Put;
   end select;
end select;

这可能会给你你想要的东西,虽然理解ATC可能会很棘手。

© www.soinside.com 2019 - 2024. All rights reserved.