我的程序在用戶點擊軸對象時運行一個函數。該函數使用光標的位置並將其進度顯示爲動畫。我需要的是當用戶點擊一個新的位置時停止當前正在運行的函數調用,然後調用這個新位置的函數。如何等待在gui回調函數中終止運行函數?
我的代碼是這樣的(在我的原代碼,我使用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
。
在完成之前是否要禁止任何新的點擊? – Suever
@Suever不,我想等待'Animate'完成它的工作,它會在下一次迭代中檢查'xnow'和'ynow'並返回。 – saastn