枕上从妨一夜睡,灯前读尽十年诗。这篇文章主要讲述Matlab - AppDesigner:使用GUI中断循环相关的知识,希望能为你提供帮助。
我创建了一个GUI,它根据外部.m文件计算轨迹。
文章图片
当用户按下“计算”按钮时,外部.m函数文件将通过按钮的回调函数调用:
% calculateBtn button pushed function
function calculate(app)
numSteps = app.stepSlider.Value;
app.omega = app.omegaSpin.Value;
app.phid = app.phi.Value;
app.x0 = app.x0Spin.Value;
app.y0 = app.y0Spin.Value;
app.u0 = app.u0Spin.Value;
app.v0 = app.v0Spin.Value;
set(app.calculateBtn, 'Enable', 'off')
set(app.showBtn, 'Enable', 'off')[app.Xc, app.Xi, app.C, T, f]=coriolis_traj(app.x0, app.y0, app.u0, app.v0, app.phid, numSteps);
app.fEdit.Value = https://www.songbingjia.com/android/num2str(f);
app.tEdit.Value = num2str(T);
set(app.calculateBtn,'Enable', 'on')if length(app.Xc)>
1
set(app.showBtn, 'Enable', 'on')
else
set(app.showBtn, 'Enable', 'off')
endend
外部文件包含计算的主循环。
while 1
% Counters
i = i + 1;
t = t + Dt;
theta = theta + Omega * Dt;
% Parcel's Position
% on the Inertial Frame
x1 = x0 + Dt*u0;
y1 = y0 + Dt*v0;
% Parcel's position translated to the
% rotating frame
xc1 = x1*cos(theta)+y1*sin(theta);
yc1 = x1*sin(theta)+y1*cos(theta);
x(i) = x1 ;
y(i) = y1;
xc(i) = xc1 ;
yc(i) = yc1;
x0 = x1 ;
y0 = y1;
[in] = inpolygon(xc,yc,xv,yv);
if ~in(i) >
0
break;
end
end
当用户更改“控件”面板中的任何值或按下“按下”按钮时,我想停止计算并清除计算出的数组。
关于如何编码的任何想法?
答案我能想到的最好的解决方案是将你的
while
循环放入GUI回调中。你的while
循环的内部代码可以保存在一个单独的外部文件中,但引入循环将使你完全控制它并使中断更容易。唯一的限制是它必须不那么“紧”......它必须包含一个小的pause
(如果后跟drawnow()
调用则更好),这样主GUI线程就可以有时间处理应用程序消息。【Matlab - AppDesigner(使用GUI中断循环)】这是你的回调代码:
% Computation Callback
function Button1_Callback(obj,evd,handles)
obj.Enable = 'off';
% disable this button
handles.Button2.Enable = 'on';
% enable the interruption button
handles.stop = false;
% the control variable for interruptionwhile (true)
% call your external function for running a computational cycle
res = myExternalFunction(...);
% refresh the application handles
handles = guidata(obj);
% interrupt the loop if the variable has changed
if (handles.stop)
break;
end% this allows the loop to be interrupted
pause(0.01);
drawnow();
endobj.Enable = 'on';
end% Interruption Callback
function Button2_Callback(obj,evd,handles)
obj.Enable = 'off';
% disable this buttonhandles = guidata(obj);
handles.stop = true;
end
推荐阅读
- 在Recycler视图上添加图像视图时,Android导航抽屉动画滞后/减速
- 使用循环或lapply来读取和命名文件
- 如何从Delphi Android应用程序启动视频通话()
- R(试图理解逻辑以用lapply()替换循环)
- JSON Web Token教程(Laravel和AngularJS中的示例)
- 使用AngularJS和Play框架构建现代Web应用程序
- 使用Spring框架构建MVC应用程序(初学者教程)
- Gulp的JavaScript自动化简介
- 这些年来,世界仍然由C编程提供动力