windows - 带有编译应用程序的 Matlab onCleanup (windows)

标签 windows matlab windows-7 signals matlab-compiler

我有一个用 matlab 编译器制作的应用程序。
我想在它结束时执行一些关闭事件。由于似乎无法在 matlab 中捕获信号(或者我无法捕获信号),因此我检查了使用 onCleanup ( Matlab: Is it possible to create signal handlers (.m scripts) )。它在 matlab( native )中工作,但不在编译的应用程序中。
我尝试使用 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 也不起作用。

最佳答案

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

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

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

关于windows - 带有编译应用程序的 Matlab onCleanup (windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14140008/

相关文章:

c++ - Microsoft Windows 7 Pro 上的实时应用程序

arrays - Matlab - 从矩阵中删除包含0的行和列

Matlab 功能类似于 python 的 __name__= ='__main__'

caching - Windows 7 上的 IE11 不缓存文件

c++ - 为什么我的一些键盘事件起作用而另一些不起作用?

windows - 删除-netnatstaticmapping : The requested operation is not supported. 尝试删除 Windows docker 容器端口映射时

c++ - 创建文件 : direct write operation to raw disk "Access is denied" - Vista, Win7

debugging - 如何在 Windows 7 64 位上自动启动调试器来调试 32 位应用程序?

c++ - 在 Windows 中调试堆栈溢出?

MATLAB 计时器对象陷阱和不良使用