6

我有一个用 matlab 编译器制作的应用程序。
我想shutdown activities在它结束的时候做一些。由于似乎不可能在 matlab 中捕获信号(或者我不能),所以我检查了使用onCleanupMatlab: Is it possible to create signal handlers (.m scripts))。它在 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

我的源代码,我通过mcc -m -v sigtest.m.
作为另一个尝试,我插入了这些行

myexiter=addlistener(System.AppDomain.CurrentDomain,'ProcessExit',...
    @(a,b)save('listexit.mat'));

在第 2 行之后,这个 .NET-Event 也不起作用。

4

1 回答 1

4

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

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

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

于 2013-01-04T07:00:33.153 回答