Mon programme exécute une fonction lorsque l'utilisateur clique sur un objet axes. Cette fonction utilise la position du curseur et montre sa progression en tant qu'animation. Ce dont j'ai besoin, c'est d'arrêter l'appel de fonction en cours lorsque l'utilisateur clique sur une nouvelle position, puis d'appeler la fonction pour cette nouvelle position.Comment attendre la fin d'une fonction en cours dans une fonction de rappel gui?
Mon code est quelque chose comme ça (dans mon code original que j'utilise guidata
et handles
au lieu des variables globales):
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
Mon problème est que les clics nouvelles interruption fonction en cours d'exécution et continue à tourner précédente Animate
dans une pile. Cela rend le dernier dessin de l'animation précédente visible. Le pire est que la taille de la pile semble être 8 et les nouvelles interruptions seront stockées dans une file d'attente ! Ce qui signifie que l'utilisateur peut mettre à jour la position seulement 8 fois. Pour voir le problème, vous pouvez exécuter l'exemple de code ci-dessus et cliquer plusieurs fois sur l'objet axes.
Maintenant, je veux vérifier si Animate
est en cours d'exécution dans AxisButtonDownFcn
, et attendre sa fin (ou le terminer par la force), puis appelez Animate
avec de nouveaux paramètres.
Voulez-vous désactiver les nouveaux clics jusqu'à ce que ce soit fait? – Suever
@Suever Non, je veux attendre 'Animate' pour finir son travail, il va vérifier' xnow' et 'ynow' dans l'itération suivante et revenir. – saastn