我正在创建一个独立的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 :(得分:2)
在您的代码段中
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
答案 1 :(得分: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