【问题标题】:MATLAB GUI stop button issuesMATLAB GUI 停止按钮问题
【发布时间】:2013-01-15 22:06:59
【问题描述】:

编辑:我稍微改述了我的问题,因为我现在对这个问题有了更好的理解,而且初稿中有很多不必要的信息。

我正在创建一个独立的 MATLAB 应用程序,它需要一个可以启动和停止循环脚本的切换按钮。

基于这个helpful video,我能够在我的 gui.m 文件中实现这个想法:

function startBtn_Callback(hObject, eventdata, handles)

    if get(handles.startBtn,'Value')
        set(handles.startBtn,'String','Stop Recording');
    else
        set(handles.startBtn,'String','Start Recording');
    end

    while get(handles.startBtn,'Value');
        disp('looping..');
        pause(.5);
    end

此脚本按预期工作,但是当我替换我想要循环的函数的 while 循环的内容时,按钮停止工作。当我按下它时它仍然会切换,但只有在第一次按下按钮时才会调用回调。这是我的最终代码:

function startBtn_Callback(hObject, eventdata, handles)

    if get(handles.startBtn,'Value')
        set(handles.startBtn,'String','Stop Recording');
        pause(.1);
    else
        set(handles.startBtn,'String','Start Recording');
        disp('Recording Stopped')
    end

    while get(handles.startBtn,'Value');
        myFunction();
    end

当我按下开始按钮时,此回调运行并开始循环。需要 pause(.1) 来更改文本 - 如果我不包含暂停,循环将启动,但按钮上的文本不会更改。

在此之后,没有后续的按钮按下做任何事情。该按钮在 GUI 上切换,但 startBtn_Callback 永远不会被调用,并且循环无限期地运行。这是一个问题,因为我的最终用户将无法访问 MATLAB 控制台。

提供有关我的功能的更多信息:它是一种记录音频 5 秒,进行一些处理,然后输出一些图表的方法。我希望这个循环无限期地重复,直到用户按下停止。

我认为问题在于 MATLAB 似乎一次只能运行一个函数,所以当 myFunction() 运行时,无法启动回调。它在第一个示例中起作用的原因是循环调用之间存在暂停。我不能有这种停顿,因为项目的要求是记录每一秒。

我怎样才能为这个过程制作一个可靠的停止按钮?

我正在运行 MATLAB R2012b 32 位。

【问题讨论】:

    标签: matlab user-interface matlab-guide


    【解决方案1】:

    在你的代码 sn-p

    a=get(handles.startBtn,'Value')
    while a
        myFunction();
    end
    

    a 的值被赋值一次,之后永远不会改变。因此,while-loop 要么永远不会运行,要么永远循环。

    while get(handles.startBtn,'Value')
        myFunction();
    end
    

    将在每次迭代时查询按钮的值,但是,特别是如果 myFunction 执行时间不长,将会有大量的 java 请求可能会使您的 GUI 迟缓。

    这就是您遵循的示例使用 pause 行的原因,因此循环仅每 0.5 秒左右执行一次。

    如果您不想在while-line 中进行查询,您也可以编写

    %# read inital value of a
    a=get(handles.startBtn,'Value');
    while a
        myFunction();
        %# update a
        a=get(handles.startBtn,'Value');
    end
    

    【讨论】:

    • 好的,我理解 a 的问题。当我将查询放回 while 行并在循环中更新 a 时,a 的计算结果为 0.. 为什么循环甚至在运行? get 查询在 while 行中返回 1,在 a= 行中返回 0。
    • Nvm,循环在值改变之前启动。在这种情况下,循环没有再次运行。但仍然没有解决主要问题,现在,由于某种未知原因,我无法重新创建停止脚本运行的情况。
    【解决方案2】:

    drawnow() 是我正在寻找的函数。把它放在 myFunction() 之后会强制 Matlab 在继续循环之前处理任何堆积的 GUI 调用。

    此代码为不确定和连续的过程创建了一个可靠的开始/停止切换按钮:

    function startBtn_Callback(hObject, eventdata, handles)
    
      if get(handles.startBtn,'Value')
          set(handles.startBtn,'String','Stop');
          drawnow();
      else
          set(handles.startBtn,'String','Start');
      end
      while get(handles.startBtn,'Value');
          myFunction();
          drawnow()
      end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多