用户界面- MATLAB GUI停止按钮问题



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

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

基于这个有用的视频,我能够在我的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秒的音频,做一些处理,然后输出一些图形。我希望这个循环无限重复,直到用户按下stop。

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

我如何为这个过程制作一个可靠的停止按钮?

我运行的是32位的MATLAB R2012b。

在你的代码片段

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

a的值只赋一次,以后不再改变。因此,while -循环要么永远不会运行,要么永远循环下去。

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

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

这就是为什么后面的示例使用pause行,这样循环大约每0.5秒才执行一次。

如果您不想在while行中有查询,您可以选择写

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

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

相关内容

  • 没有找到相关文章

最新更新