matlab gui 循环计算过程实现暂停和继续计算
前段时间的一个问题【matlab gui 循环计算过程实现暂停和继续计算】(编号426631696194936852)是题主问的吧?
由于度娘弱智又恶心的过滤机制,后续的交流一直不顺畅(我试图通过评论说明多次被删,也看到多次有评论提醒,但打开却看不到),现把代码上传到这里。
基本做法是,在进行循环之前,加上以下几句:
fig=gcf; figure(fig);
setappdata(fig,'Disu_Pause',0)
set(fig,'WindowButtonDownFcn','setappdata(gcbf,''Disu_Pause'',~getappdata(gcbf,''Disu_Pause''))');
然后,在每个循环体的最里层的最前面,加上
% 通过获取自定义的数据Disu_Pause判断是否暂停;关闭窗口则退出
try
while true
if ~getappdata(fig,'Disu_Pause')
break
else
pause(0.01)
end
end
catch me
return
end
基本思想:
1、通过自定义窗口的应用数据避免使用全局变量;
2、设置窗口的WindowButtonDownFcn回调函数在点击鼠标时改变应用数据;
3、在每个循环中,如果状态为pause,则利用形式上的死循环进行等待(每次0.01秒,是系统时钟的精度),如果不是状态,则退出等待的循环体;
4、用try-catch结构,在关闭窗口时返回(即退出程序)。
用全局变量也行,但是循环体里面要加入drawnow()函数,让函数有机会读取你更改的全局变量以实现停止。
一个按钮开始循环,预留全局变量中断循环,另一个按钮改变全局变量。
点击一个按钮,不断的输出i自增的数值,然后一个if判别全局变量控制循环的中断,在循环体中,插入drawnow(),让函数有机会读取你更改的全局变量。这个按钮下的代码如下:
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global h;
i=1;
while 1
i=i+1
if (h==0)
break;
end
drawnow()
end
另一个按钮,改变全局变量
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% handles.h=0;
global h;
h=0;
提示:需要已经在OpeningFcn声明过全局变量。