【问题标题】:MATLAB event and infinite sleeping or checking loopMATLAB 事件和无限休眠或检查循环
【发布时间】:2012-06-06 13:55:25
【问题描述】:

我需要在目录中的文件进入时对其进行数据分析。

我想知道,如果它更好,

  1. 在目录上实现一个事件监听器,并在激活时启动分析过程。然后让程序永远进入睡眠状态:while(true), sleep(1e10), end

  2. 或循环轮询更改并做出反应。

我个人更喜欢侦听器的方式,因为可以对几乎同时出现的两个新文件启动两次分析,但会导致两个事件。而另一种解决方案可能只处理第一个,然后找到第二个新数据。
选项 1 的附加想法:通过调用 frames=java.awt.Frame.getFrames 并在匹配 com.mathworks.mde.desk.MLMainFrame 框架的 index 上设置 frames(index).setVisible(0) 来隐藏 matlab GUI。 (此思路取自Yair Altman

还有其他方法可以实现这些吗?

【问题讨论】:

    标签: events matlab event-handling infinite-loop


    【解决方案1】:

    在这种情况下,(如果您使用的是 Windows),最好的方法是使用.NET 的强大功能。

    fileObj = System.IO.FileSystemWatcher('c:\work\temp');
    fileObj.Filter = '*.txt';
    fileObj.EnableRaisingEvents = true;
    addlistener(fileObj,'Changed',@eventhandlerChanged);
    

    有不同的事件类型,你可以为它们使用相同的回调,也可以使用不同的:

    addlistener(fileObj, 'Changed', @eventhandlerChanged );
    addlistener(fileObj, 'Deleted', @eventhandlerChanged );
    addlistener(fileObj, 'Created', @eventhandlerChanged );
    addlistener(fileObj, 'Renamed', @eventhandlerChanged );
    

    eventhandlerChanged 是您的回调函数。

    function eventhandlerChanged(source,arg)
       disp('TXT file changed')
    end
    

    无需使用sleep 或轮询。如果你的程序是基于 UI 的,那么就没有什么可做的了,当用户关闭图形时,程序就结束了。事件回调的执行与按钮单击完全相同。如果你的程序是类似脚本的,你可以使用无限循环。

    更多信息在这里:http://www.mathworks.com/help/matlab/matlab_external/working-with-net-events-in-matlab.html

    【讨论】:

    • 确实,就是我建议购买选项号 1 的方法 - 但由于这应该是一个脚本,它应该永远等待吗?也许,这是一个想法 - 但它是开放的输入......
    • @BastianEbeling:您的程序将是事件驱动的(从回调函数内部执行您的数据分析)。不错的解决方案顺便说一句 +1
    • @Andrey:据我了解,这只会在文件更改时触发,而不是在添加/删除文件时触发,对吧?你也需要听那些事件
    • @Amro,还有另一个要添加/删除的事件。通常我对他们使用相同的回调。我更新了我的答案
    • 嗨@Amro 和Andrey,你的想法(我的选项1)很好。此外,是否有机会让这些听众保持活跃并结束所有其他 matlab 交互事物?也许删除输入设备或类似的东西?我现在用“-automation”启动matlab,但也许有更好的选择?
    猜你喜欢
    • 2014-06-26
    • 2015-07-22
    • 2018-12-23
    • 2013-03-14
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    相关资源
    最近更新 更多