Matlab waitbar - закрыть все не работает - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть код, который создает панель ожидания:

if long_process %user specifies this true/false
    h = waitbar(1/4, msg);
end
process(arg1,arg2);

Процесс - это некая функция, которая выполняет некоторые графики.Если я выполняю CTRL-C где-то в процессе и у меня остается окно с рисунком, я могу просто закрыть все, и рисунок исчезнет.Тем не менее, панель ожидания остается.Я не знаю, как сделать эту штуку закрытой с помощью команды «закрыть все».

Причина, по которой это беспокоит, заключается в том, что, когда я начинаю отладку, у меня часто заканчивается 20+ открытых полос ожидания.«закрыть все», тогда пригодится.

1 Ответ

14 голосов
/ 07 декабря 2011

На самом деле, функция ЗАКРЫТЬ дает вам несколько более «мощных» опций:

close all hidden
close all force

И если по какой-то причине они не работают, у вас есть один «ядерный» вариант: удалить все фигуры, в том числе со скрытыми ручками, как предложено в ЗАКРЫТЬ и WAITBAR документация:

set(0,'ShowHiddenHandles','on');
delete(get(0,'Children'));

Возможно, вам будет проще создать собственную вспомогательную функцию, которая сделает это за вас (и вернет состояние 'ShowHiddenHandles' в состояние по умолчанию 'off'), чтобы у вас не было такого большого количества набрать:

function killEmAll
  set(0,'ShowHiddenHandles','on');
  delete(get(0,'Children'));
  set(0,'ShowHiddenHandles','off');
end


... И даже третий вариант - попытаться вообще избежать этой проблемы (если это позволяет организация вашего кода), используя onCleanup objects ! Если вы запустите следующий пример кода, панель ожидания должна быть автоматически удалена для вас, когда вы нажмете CTRL-C из бесконечного цикла:

function runprocess
  h = waitbar(1/4, 'la la la...');
  waitObject = onCleanup(@() delete(h));
  process();
end

function process
  i = 1;
  while (i > 0)
    i = i + 1;
  end
end
...