0

MATLABGUIでウェイトバーを更新する際に問題が発生しました。

期待どおりに機能する簡単な例を作成しました。

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

ただし、GUIでこの構造を使用すると...

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);

...ウェイトバーは、最初のforループの反復でのみ正しく表示されます。

2番目の相互作用は実行で失敗します:

Error using waitbar(109)
Improper arguments for waitbar.
  • ウェイトバーの進行値が1を超えないことを確認しました。
  • if/elseループの外側までウェイトバーが閉じられていないことを確認しました。
4

1 に答える 1

0

私は解決策を見つけました-私はハンドルグラフィックスを誤解していました。

私の元のコードでは:

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); 

デバッガーを使用して、ウェイトバーが現在の図になり、imagescがメインフォームの軸の代わりにそれにプロットしようとしたことを確認しました。参照呼び出しの直前に適切な数値を現在のものとして設定すると、適切な動作が得られました。

修正されたコード:

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); 
于 2012-05-07T18:14:51.653 に答える