2013-01-15 235 views
1

编辑:我改写了一下我的问题,因为我现在对问题有了更好的理解,第一稿中有很多不必要的信息。MATLAB GUI停止按钮问题

我正在创建一个独立的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位。

回答

0

的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 
2

在您的代码段

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

a值分配一次,永远不会改变之后。因此,将永远不会运行,否则它将永远循环。

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 
+0

好的,我明白了这个问题。当我把查询放回while行并在循环中更新a时,评估值为0 ..为什么循环甚至运行? get查询在while行中返回1,在a =行中返回0。 – Cbas

+0

Nvm,在值更改之前启动循环。在这种情况下循环没有再次运行。尽管如此,仍然没有解决主要问题,现在,由于某种未知的原因,我无法重新创建停止脚本运行的情况。 – Cbas