我有一个用matlab编译器编写的应用程序
我想在结束时做一些shutdown activities
。由于似乎无法在matlab中捕获信号(或者我无法捕获),因此我检查了使用onCleanup
(Matlab: Is it possible to create signal handlers (.m scripts))。它在matlab(本机)中工作,但不在编译的应用程序中
我尝试使用 CTRL-C 和 taskkill (仅适用于 / f )结束应用程序。在这两种情况下都没有执行onCleanup方法
出于测试目的
function sigtest(varargin)
remainder=onCleanup(@()save('exit.mat'));
b=1;
while true
disp(datestr(now));
a=rand(round(5*b));%to be saved
pause(10);
b=a(1);
end
我的源代码,我是通过mcc -m -v sigtest.m
编译的
作为onether尝试,我插入了行
myexiter=addlistener(System.AppDomain.CurrentDomain,'ProcessExit',...
@(a,b)save('listexit.mat'));
在第2行之后,但这个.NET-Event也无效。
答案 0 :(得分:4)
如果您在M代码中注册关闭活动,他们只会正常关闭该进程。 taskkill /f
命令将执行“强制”关闭,我认为这将立即终止该过程。 Matlab解释器将无法运行任何尚未处理的清理代码。我认为控制台应用程序上的Ctrl-C(编译的sigtest.m将作为其运行)将具有相同的效果。同样适用于.NET事件:如果您强制终止该进程,则该回调永远不会有机会运行。
如果你想要退出代码或任何其他清理工具,你需要找到一种方法让程序找出它何时应该退出并启动更优雅的关闭。例如,在您的sigtest示例中,您可以在每次循环结束时检查stdin,查看用户是否键入了“quit”,如果是,请调用exit()
。然后你的onCleanup应该运行。
在GUI编译的Matlab应用程序中,这更直接;你有GUI控件来退出应用程序。我不知道规范的方法是使控制台编译Matlab应用程序响应用户退出请求,或者是否有一个好的。如果您认为用户可能要请求正常中止其操作,您可能希望将其设为GUI应用程序。