我的程序遇到了一些问题。
我有一个调用函数 (Take_Job) 的进程,该函数应该保持阻塞状态,直到经过一段时间 (MINIMUM_WAIT)。如果它没有以这种方式发生,则会出现一条通知这种情况的消息。
for Printer_Id in Type_Printer_Id loop
select
delay MINIMUM_WAIT
Pragma_Assert (True, "");
then abort
Take_Job (Controller,
Printer_Id,
Max_Tonner,
Job,
Change_Tonner);
Pragma_Assert
(False,
"Testing of Take_Job hasn't been successful. It should have remained blocked.");
end select;
end loop;
函数 Take_Job 调用受保护对象中的条目:
procedure Take_Job (R : in out Controller_Type;
Printer : in Type_Printer_Id;
Siz : in Typo_Volume;
Job : out Typo_Job;
Excep_Tonner : out Boolean) is
begin
R.Take_Job(Printer, Siz, Job, Excep_Tonner);
end Take_Job;
其中“R”是受保护对象。
以下代码是受保护对象的入口。实际上,“何时”条件为 True,因为我需要使用条目的参数检查一些东西。由于 Ada 不允许我这样做,我复制受保护对象内的参数并调用“延迟条目”,然后在“延迟条目”中,我将确保在继续之前满足条件。
entry Take_Job(Printer_Id: in Type_Printer_Id; Remaining: in Type_Volume; Job: out Type_Job; exceptionTonner: out Boolean)
when True is
begin
Copy_Remaining(Printer_Id) := Remaining;
requeue Take_Job_Delayed(Printer_Id);
end Take_Job;
让我们看看“延迟进入”代码:
entry Take_Job_Delayed(for J in Type_Printer_Id)(Printer_Id: in Type_Printer_Id; Remaining: in Type_Volume; Job: out Type_Job; exceptionTonner: out Boolean)
when False is -- I've done this on purpose
begin
null; -- Actually, there would be a lot of code here
end Take_Job_Delayed;
假设我的目标是通过 MINIMUM_WAIT 并运行“Pragma_Assert(True, "")”。如果我将 Take_Job 的“when”条件设置为“False”,那么一切正常。Take_Job 永远不会被接受,并且 Pragma_Assert 将被执行。如果我将它设置为“True”并且 Take_Job_Delayed 的“when”条件设置为“False”,我不会得到相同的效果,并且进程被阻塞并且两个 Pragma_Asserts 都不会被执行。
为什么?看起来问题出在“重新排队”或附近的某个地方,但为什么会发生这种情况?