Matlab onCleanup与编译应用程序(windows)

Bas*_*ing 6 windows matlab signals windows-7 matlab-compiler

我有一个用matlab编译器编写的应用程序.
我想shutdown activities在它结束时做一些事情.因为似乎不可能在matlab中捕获信号(或者我不能),我检查使用onCleanup(Matlab:是否可以创建信号处理程序(.m脚本)).它在matlab(本机)中工作,但不在编译的应用程序中.
我试图用CTRL-Ctaskkill(只能用于/ 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
Run Code Online (Sandbox Code Playgroud)

我的源代码,我编译通过mcc -m -v sigtest.m.
作为onether试试,我插入了线条

myexiter=addlistener(System.AppDomain.CurrentDomain,'ProcessExit',...
    @(a,b)save('listexit.mat'));
Run Code Online (Sandbox Code Playgroud)

在第2行之后,这个.NET-Event也无法正常工作.

And*_*nke 4

如果您在 M 代码中注册关闭活动,它们只会在进程正常关闭时起作用。该taskkill /f命令将执行“强制”关闭,我认为这将立即终止进程。Matlab 解释器将没有机会运行任何仍待处理的清理代码。我认为控制台应用程序(编译后的 sigtest.m 将作为其运行)上的 Ctrl-C 将具有相同的效果。这同样适用于 .NET-Event:如果您强制终止该进程,该回调将永远没有机会运行。

如果您希望运行退出时代码或任何其他清理内容,您需要找到一种方法让程序确定何时应该退出并自行启动更优雅的关闭。例如,在您的 sigtest 示例中,您可以在每次循环结束时检查 stdin,查看用户是否输入了“quit”,如果是,则调用exit(). 然后你的 onCleanup 东西应该运行。

在 GUI 编译的 Matlab 应用程序中,这更加简单;您可以使用 GUI 控件来退出应用程序。我不知道使控制台编译的 Matlab 应用程序响应用户退出请求的规范方法是什么,或者是否有一个好的方法。如果您认为用户可能想要请求正常中止其操作,您可能希望将其设为 GUI 应用程序。