You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ada语言任务属性的Getters与Setters实现方法咨询

在Ada中为任务属性实现Getters和Setters

嘿,刚学Ada的话得先搞明白:Ada里的任务是独立的并发执行单元,它的内部变量是完全私有的,外部代码根本没法直接访问。所以要实现getter和setter,得用Ada的**入口(Entry)**机制——这是任务间安全通信的标准方式。

我给你写一套完整的实现,包括包规范和包体,刚好对应你需要的deadline、period和computingTime三个属性:

第一步:编写包规范(pkg_tasks.ads)

首先得在包规范里声明任务的入口,这样外部代码才能调用这些getter和setter:

with Ada.Real_Time; use Ada.Real_Time;

package pkg_tasks is
   task type task_a is
      -- Setter入口:用来修改属性值
      entry Set_Deadline(New_Deadline : in Time_Span);
      entry Set_Period(New_Period : in Time_Span);
      entry Set_Computing_Time(New_Time : in Time_Span);
      
      -- Getter入口:用来读取属性值
      entry Get_Deadline(Current_Deadline : out Time_Span);
      entry Get_Period(Current_Period : out Time_Span);
      entry Get_Computing_Time(Current_Time : out Time_Span);
   end task_a;
end pkg_tasks;

第二步:实现包体(pkg_tasks.adb)

接下来在包体里完成任务的逻辑,包括内部变量的初始化和入口的处理:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Real_Time; use Ada.Real_Time;

package body pkg_tasks is
   task body task_a is
      -- 初始化你的三个属性
      deadline : Time_Span := To_Time_Span(25.0);
      period : Time_Span := To_Time_Span(25.0);
      computingTime : Time_Span := To_Time_Span(5.0); -- 这里补全了你省略的数值,可按需修改
   begin
      -- 任务的主循环:持续处理外部的入口请求
      loop
         select
            -- 处理Set_Deadline请求:更新内部的deadline变量
            accept Set_Deadline(New_Deadline : in Time_Span) do
               deadline := New_Deadline;
            end Set_Deadline;
         or
            accept Set_Period(New_Period : in Time_Span) do
               period := New_Period;
            end Set_Period;
         or
            accept Set_Computing_Time(New_Time : in Time_Span) do
               computingTime := New_Time;
            end Set_Computing_Time;
         or
            -- 处理Get_Deadline请求:把当前值返回给调用者
            accept Get_Deadline(Current_Deadline : out Time_Span) do
               Current_Deadline := deadline;
            end Get_Deadline;
         or
            accept Get_Period(Current_Period : out Time_Span) do
               Current_Period := period;
            end Get_Period;
         or
            accept Get_Computing_Time(Current_Time : out Time_Span) do
               Current_Time := computingTime;
            end Get_Computing_Time;
         or
            -- 加个短延迟避免空循环占用过多CPU,也可替换为任务核心逻辑
            delay 0.1;
         end select;
      end loop;
   end task_a;
end pkg_tasks;

第三步:调用示例

给你写个主程序例子,看看怎么用这些getter和setter:

with pkg_tasks; use pkg_tasks;
with Ada.Real_Time; use Ada.Real_Time;
with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
   My_Task : task_a;
   Current_Deadline : Time_Span;
begin
   -- 设置新的deadline为30秒
   My_Task.Set_Deadline(To_Time_Span(30.0));
   
   -- 获取当前的deadline并打印出来
   My_Task.Get_Deadline(Current_Deadline);
   Put_Line("当前deadline:" & Duration'Image(To_Duration(Current_Deadline)) & " 秒");
end Main;

一些关键说明

  • 并发安全:Ada的入口调用是同步的,同一时间只有一个入口请求会被任务处理,完全不用担心数据竞争的问题。
  • 任务主循环:任务必须保持运行状态才能处理入口请求,所以主循环要一直跑(除非你有明确的退出条件,比如加个exit入口)。
  • Time_Span转换:如果要打印Time_Span的值,可以用To_Duration转换成Duration类型,方便输出。

内容的提问来源于stack exchange,提问作者thmasker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:08:32