【问题标题】:Matlab onCleanup with Compiled applications (windows)Matlab onCleanup 与已编译的应用程序(Windows)
【发布时间】:2012-12-17 21:07:29
【问题描述】:

我有一个使用 matlab 编译器制作的应用程序。
我想在它结束时做一些shutdown activities。由于似乎不可能在 matlab 中捕获信号(或者我无法捕获),因此我检查了使用 onCleanup (Matlab: 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 也不起作用。

【问题讨论】:

    标签: windows matlab windows-7 signals matlab-compiler


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的解释 - 我之前已经很清楚了。用户不应该能够交互。我倾向于将该进程实现为 Windows 服务,因此我想捕获关闭事件。因此,GUI 不是解决方案。也许可以在这些 GUI 文件中找到合适的方法?你有提示吗?
    • 啊。是的,那时没有图形用户界面。您可能需要编写 Windows 服务启动和关闭挂钩代码以分别调用 mclInitialize()/libXxxxInitialize() 和 libXxxTerminate()/mclTerminate()。 (我会考虑使用mcc -l 将您的 M 代码编译为库而不是独立应用程序,然后使用 Vis Studio 构建一个链接到您的 DLL 中的 Windows 服务项目。)“停止服务”WS 挂钩应该告诉 Matlab 代码退出。不知道执行此操作的“正确”方法 - 也许让它设置一个全局 Matlab 变量,您的 M 代码在其顶级循环中检查并在设置时退出。有意义吗?
    • 仅供参考,这是另一个关于以编程方式执行 Ctrl-C 行为的问题,我认为这实际上是您在这里寻找的。 stackoverflow.com/questions/10033078/… 不幸的是,所有答案都使用 GUI 的东西,所以我认为它们在这里不适合你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多