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
相关产品推荐
相关产品推荐

