2012-05-07 4 views
0

Je rencontre un problème lors de la mise à jour d'une barre d'attente dans une interface graphique MATLAB.La mise à jour de la barre d'attente MATLAB échoue après la première mise à jour

J'ai créé un exemple simple qui fonctionne comme prévu.

steps = 5; 
hWaitBar = waitbar(0, 'Testing...'); 
for i = 1:steps 
    waitbar(i/steps, hWaitBar); 
    pause(1); 
end 
close(hWaitBar); 

Cependant quand j'utilise cette construction dans l'interface graphique ...

numSteps = %calculated 
hWaitBar = waitbar(0, 'Processing...'); 

if %conditional 
    for i = 1:numSteps 
     waitbar(i/numSteps, hWaitBar) 
     % additional processing 
    end 
else %conditional 
    % additional processing 
end 

close(hWaitBar); 

... le waitbar affiche correctement que pour la première pour l'itération de la boucle.

La deuxième itération échoue avec le Execption:

Error using waitbar(109) 
Improper arguments for waitbar. 
  • j'ai vérifié que la valeur de progression de waitbar ne dépasse pas 1.
  • j'ai vérifié que le waitbar ne soit pas fermé jusqu'à ce que l'extérieur de la if/else boucle.
+0

Quelle est votre valeur de départ de 'numSteps'? (Ce n'est pas inclus dans votre exemple.) Y a-t-il quelque chose dans votre bloc de code «traitement supplémentaire» qui modifie «i», «numSteps» ou «hWaitBar»? Avez-vous un exemple de travail minimal qui produit l'erreur? – blafrat

+0

Pour mes tests, numSteps = 2. Il n'y a rien dans mes blocs de traitement qui modifie i, numSteps ou hWaitBar. Votre suggestion de produire un exemple de travail minimal m'a conduit à décommenter sélectivement les lignes jusqu'à ce que je trouve celui qui a créé l'erreur. C'est un appel à imagesc. – Noren

Répondre

0

J'ai trouvé la solution - j'ai mal manipulé les graphiques.

Dans mon code d'origine:

numSteps = %calculated 
hWaitBar = waitbar(0, 'Processing...'); 

if %conditional 
    for i = 1:numSteps 
     waitbar(i/numSteps, hWaitBar) 
     % additional processing 
     % *** call to imagesc caused the error 
    end 
else %conditional 
    % additional processing 
end 

close(hWaitBar); 

En utilisant le débogueur, j'ai vu que le waitbar est devenu le chiffre actuel et imagesc a essayé de tracer à elle au lieu de l'axe sur la principale forme. La définition de la figure appropriée en tant que courant immédiatement avant les appels de référence a généré un comportement correct.

Code Rectifié:

numSteps = %calculated 
hForm = gcf; % save the handle of the main form 
hWaitBar = waitbar(0, 'Processing...'); 

if %conditional 
    for i = 1:numSteps 
     % set the waitbar to be the current figure before it is updated 
     % note: this syntax will ensure window order will be preserved 
     %  with waitbar on top 
     set(0, 'CurrentFigure', hWaitBar); 
     waitbar(i/numSteps, hWaitBar); 

     % additional processing 
     set(0, 'CurrentFigure', hForm); 
     imagesc(...); 
     % more processing 
    end 
else %conditional 
    % additional processing 
end 

close(hWaitBar); 
Questions connexes