暂停While循环的执行,并使用PushButtons App Designer从同一点恢复

56个观点(过去30天)
这就跟你问声好!我在AppDesigner中用while循环做了一个动画,我使用uiwait和uiresume在它们的回调中的按钮暂停和恢复它,显然它工作,因为当我点击“暂停”图像冻结,但当我按“恢复”按钮时,似乎while循环一直在运行,因为到那时动画已经前进,就像它从一个图像跳到另一个时间。
我在另一个帖子里看到的
如何暂停while循环,然后从我暂停它的同一点继续??
我很感激你的建议
函数StartButtonPushed(应用程序、事件)
关闭所有
集(应用程序。StartButton,“文本”“重启”
时间= 120;
集(应用程序。UIAxes,“单位”“点”
班(app.UIAxes);
R = 65;
ang = linspace(0, 2 *π,50);
xp = R * cos (ang);
yp = R * sin (ang);
%的动画
画外圆
补丁(应用程序。UIAxes,xp,yp,' w '
(应用程序。UIAxes,“上”);
轴(应用程序。UIAxes,“平等”);
%线
rho1 = 55;
行=情节(应用程序。UIAxes,南南“- *”“线宽”5,“MarkerSize”, 0.5,“颜色”“k”);
抽搐
toc <时间
t1 = toc;
f = 0.2 * 360;
线。XData = [0, rho1*cosd(-f*t1)];
线。YData = [0, rho1*sind(-f*t1)];
drawnow
结束
结束
%按钮按下功能:暂停按钮
函数PauseButtonPushed(应用程序、事件)
uiwait (app.animation)
结束
%按钮按下功能:ResumeButton
函数ResumeButtonPushed(应用程序、事件)
uiresume (app.animation)
结束
结束

接受的答案

里克
里克 2021年7月6日
编辑:里克 2021年7月8日
问题的原因是您使用的是toc,它仍然会继续运行。
如果测量GUI暂停的时间,可以将其存储在一个属性中。如果你用t1减去它,你可以有效地暂停时间。
请参阅下面的代码,了解我的建议。还应该考虑始终使用显式句柄 toc .否则,您将测量从上次开始的时间 抽搐 ,而不是匹配的调用。
t_h =抽搐;app.PauseTime = 0;
真正的
t1 = toc (t_h) -app.PauseTime;
如果t1 >,打破结束
f = 0.2 * 360;
线。XData = [0, rho1*cosd(-f*t1)];
线。YData = [0, rho1*sind(-f*t1)];
drawnow
结束
结束
%按钮按下功能:暂停按钮
函数PauseButtonPushed(应用程序、事件)
app.PauseHandle =抽搐;
uiwait (app.animation)
结束
%按钮按下功能:ResumeButton
函数ResumeButtonPushed(应用程序、事件)
app.PauseTime = app.PauseTime + toc (app.PauseHandle)
uiresume (app.animation)
结束
7评论
里克
里克 2021年10月14日
您需要一个显式的位置来暂停执行。你能做的就是创建一个暂停几秒钟的while循环。这样,您就可以每隔几秒钟检查标志并从该点开始恢复,而无需使用太多资源。
这是最简单的方法。困难的方法是编写代码,使代码能够恢复模拟。这将要求您以这样一种方式编写代码,即它可以简单地基于上一次迭代计算下一次迭代。

登录发表评论。

更多的答案(0)

s manbetx 845


释放

R2021a

社区寻宝

在MATLAB中央找到宝藏,并发现社区可以如何帮助你!

开始狩猎!