当Ada应用程序被关闭/终止时,我想要一些'清理'调用.
例如,如果我在java中,我会做这样的事情来达到在关机时调用的效果:
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run(){
method();
}
});
Run Code Online (Sandbox Code Playgroud)
在Ada中有类似的东西或其他方式来实现这一目标吗?
Mar*_*c C 11
由于Ada主程序被视为任务,因此您可以使用Ada.Task_Termination包来管理执行后清理.在Ada 2005 Rationale中有一篇关于此的文章,接下来是我在一个示例的基础上编写的快速演示.
您必须提供库级保护终止过程,因此这是一个包:
with Ada.Task_Termination;
with Ada.Task_Identification;
with Ada.Exceptions;
package Main_Program_Finalization is
protected Shutdown_Handler is
procedure Termination_Finalizer
(Cause : in Ada.Task_Termination.Cause_Of_Termination;
T : in Ada.Task_Identification.Task_Id;
X : in Ada.Exceptions.Exception_Occurrence);
end Shutdown_Handler;
end Main_Program_Finalization;
Run Code Online (Sandbox Code Playgroud)
身体:
with Text_IO; use Text_IO;
package body Main_Program_Finalization is
protected body Shutdown_Handler is
procedure Termination_Finalizer
(Cause : in Ada.Task_Termination.Cause_Of_Termination;
T : in Ada.Task_Identification.Task_Id;
X : in Ada.Exceptions.Exception_Occurrence)
is
use Ada.Task_Termination;
use Ada.Task_Identification;
use Ada.Exceptions;
begin
New_Line;
Put_Line("Shutdown information:");
New_Line;
case Cause is
when Normal =>
Put_Line("Normal, boring termination");
when Abnormal =>
Put_Line("Something nasty happened to task ");
Put_Line(Image(T));
when Unhandled_Exception =>
Put_Line("Unhandled exception occurred in task ");
Put_Line(Image(T));
Put_Line(Exception_Information(X));
end case;
end Termination_Finalizer;
end Shutdown_Handler;
end Main_Program_Finalization;
Run Code Online (Sandbox Code Playgroud)
主程序(设置为已发布的正常终止,取消注释最后两行并运行它以查看未处理的异常触发终止的影响):
with Main_Program_Finalization;
with Ada.Task_Identification;
with Ada.Task_Termination;
with Text_IO; use Text_IO;
procedure task_term is
use Ada;
Task_ID : Task_Identification.Task_Id
:= Task_Identification.Current_Task;
begin
Put_Line("Main Task ID: " & Task_Identification.Image(Task_ID));
Put_Line("Setting termination finalizer");
Task_Termination.Set_Specific_Handler
(Task_ID,
Main_Program_Finalization.Shutdown_Handler.Termination_Finalizer'Access);
Put_Line("Go off and do things now...");
delay 1.0;
Put_Line("Done with mainline processing, the shutdown handler should now execute");
-- Put_Line("Raise an unhandled exception and see what the shutdown handler does");
-- raise Constraint_Error;
end Task_Term;
Run Code Online (Sandbox Code Playgroud)
您可以为主过程创建一个受控(或Limited_Controlled)对象,该过程在其Finalization方法中调用必要的东西.
请注意,您无法访问主过程的任何局部变量,因此请将任何必要的内容放入受控对象中.
例:
with Ada.Text_IO;
with Ada.Finalization;
procedure Main is
type Cleaner is new Ada.Finalization.Limited_Controlled with record
Some_Interesting_Data : Integer;
end record;
overriding procedure Finalize (X : in out Cleaner) is
begin
Ada.Text_IO.Put_Line ("Cleaning..." & Integer'Image (X.Some_Interesting_Data));
end Finalize;
The_Cleaner : Cleaner;
begin
Ada.Text_IO.Put_Line ("Main Procedure.");
The_Cleaner.Some_Interesting_Data := 42;
Ada.Text_IO.Put_Line ("Finished.");
end Main;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1052 次 |
最近记录: |