当用户单击轴对象时,我的程序会运行一个函数。此函数使用光标的位置并将其进度显示为动画。我需要的是在用户单击新位置时停止当前正在运行的函数调用,然后为这个新位置调用函数。
我的代码是这样的(在我使用的原始代码中guidata
,而handles
不是全局变量):
function TestUI
clc; clear variables; close all;
figure; axis equal; hold on;
xlim([0 100]); ylim([0 100]);
set(gca, 'ButtonDownFcn', @AxisButtonDownFcn);
global AnimateIsRunning
AnimateIsRunning = false;
end
function AxisButtonDownFcn(ah, ~)
C = get(gca,'CurrentPoint');
global xnow ynow AnimateIsRunning
xnow = C(1, 1); ynow = C(1, 2);
if AnimateIsRunning
% ---> I need to wait for termination of currently running Animate
end;
Animate(ah, xnow, ynow);
end
function Animate(ah, x, y)
T = -pi:0.02:pi; r = 5;
global xnow ynow AnimateIsRunning
AnimateIsRunning = true;
for t = T
if ~((xnow==x)&&(ynow==y))
return;
end;
ph = plot(ah, x+r*cos(t), y+r*sin(t), '.');
drawnow;
delete(ph)
end
AnimateIsRunning = false;
end
我的问题是任何较新的点击都会中断当前正在运行的函数并保持以前Animate
在堆栈中运行。它使上一个动画的最后一个绘图保持可见。更糟糕的是堆栈的大小似乎是 8 并且新的中断将存储在队列中!这意味着用户只能更新 8 次位置。要查看问题,您可以运行上面的代码示例并重复单击轴对象。
现在,我想检查是否Animate
正在运行AxisButtonDownFcn
,并等待其终止(或强制终止),然后Animate
使用新参数调用。