Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab onCleanup与编译应用程序(windows)_Windows_Matlab_Windows 7_Signals_Matlab Compiler - Fatal编程技术网

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

Matlab onCleanup与编译应用程序(windows),windows,matlab,windows-7,signals,matlab-compiler,Windows,Matlab,Windows 7,Signals,Matlab Compiler,我有一个用matlab编译器编写的应用程序。 每当它结束时,我想做一些关闭活动。由于似乎不可能在matlab中捕捉信号(或者我不能),我选择使用onCleanup()。它在matlab(本机)中工作,但不在已编译的应用程序中。 我尝试使用CTRL-C和taskkill结束应用程序(它们仅适用于/f)。在这两种情况下,都没有执行onCleanup方法。 用于此处的测试目的 function sigtest(varargin) remainder=onCleanup(@()save('exit.ma

我有一个用matlab编译器编写的应用程序。
每当它结束时,我想做一些关闭活动。由于似乎不可能在matlab中捕捉信号(或者我不能),我选择使用
onCleanup
()。它在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事件也不起作用。

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

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


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

谢谢您的解释,我以前已经很清楚了。用户应该不能进行交互。我倾向于将该过程实现为windows服务,因此我希望捕获关闭事件。因此,GUI不是解决方案。也许可以在这些GUI文件中找到合适的方法?你有什么提示吗?啊。是的,没有GUI。您可能需要编写Windows服务启动和关闭挂钩代码,分别调用mclInitialize()/libXxxxInitialize()和libXxxTerminate()/mclTerminate()。(我会考虑使用
mcc-l
将你的M代码编译成一个库而不是一个独立的应用程序,然后使用Vis Studio构建一个链接到你的DLL中的Windows服务项目。)“停止服务”WS-hook应该告诉Matlab代码退出。不知道这样做的“正确”方法-可能让它设置一个全局Matlab变量,M代码在顶级循环中检查该变量,并在设置时退出。有意义吗?仅供参考,这里有另一个问题是关于以编程方式执行Ctrl-C行为,我认为这正是您在这里寻找的。不幸的是,所有的答案都使用GUI的东西,所以我认为它们在这里不适合你。