MATLAB® позволяет вам управлять, может ли функция обратного вызова быть прервана, в то время как это выполняется. Например, можно позволить пользователям останавливать цикл анимации путем создания коллбэка, который прерывает анимацию. В других случаях вы можете хотеть предотвратить потенциальные прерывания, когда порядок рабочего коллбэка важен. Например, вы можете предотвратить прерывания для WindowButtonMotionFcn
коллбэк, который показывает различные разделы изображения.
Функции обратного вызова выполняются согласно их порядку в очереди. Если коллбэк выполняется, и пользовательское действие инициировало второй коллбэк, второй коллбэк пытается прервать первый коллбэк. Первым коллбэком является running callback. Вторым коллбэком является interrupting callback.
Два значений свойств управляют ответом на попытку прерывания:
Interruptible
свойство объекта, владеющего рабочим коллбэком, определяет, позволено ли прерывание. Значение 'on'
позволяет прерывание. Значение 'off'
не позволяет прерывание. Значением по умолчанию является 'on'
.
Если прерывание не позволено, то BusyAction
свойство (объекта, владеющего прерыванием обратного вызова), определяет, ставит ли MATLAB в очередь или отбрасывает прерывание обратного вызова. Значение 'queue'
позволяет прерыванию обратного вызова выполняться после рабочего выполнения концов коллбэка. Значение 'cancel'
отбрасывает прерывание обратного вызова. Значением по умолчанию является 'queue'
.
Когда Interruptible
объекта свойство установлено в
'on'
, его коллбэк может быть прерван при следующем вхождении одной из этих команд: drawnow
фигура
getframe
waitfor
приостановка
, или waitbar
.
Если рабочий коллбэк содержит одну из этих команд, то MATLAB останавливает выполнение рабочего коллбэка и выполняет прерывание обратного вызова. MATLAB возобновляет выполнение обратного вызова при завершении прерывания.
Если текущий обратный вызов не содержит одну из этих команд, MATLAB завершает выполнение обратного вызова без прерывания.
Для получения дополнительной информации о прерываемом свойстве и его эффектах, смотрите Interruptible
описание свойства на странице UIControl Properties.
В этом примере показано, как управлять прерыванием коллбэка с помощью Interruptible
и BusyAction
свойства и панель ожидания.
В MATLAB, устанавливает ваша текущая папка на ту, в которой у вас есть доступ для записи.
Выполните эту команду MATLAB:
copyfile (fullfile (docroot, 'techdoc', 'creating_guis','examples'...
'callback_interrupt.m')), fileattrib ('callback_interrupt.m', '+w');
Выполните команду, callback_interrupt
. Программа отображает два окна.
Нажатие на определенные пары кнопок демонстрирует эффект различных комбинаций значения свойства:
Прерывание коллбэка — Нажимает Wait (interruptible), сразу сопровождаемый любой кнопкой во втором окне: Surf Plot (queue) или Mesh Plot (cancel). Отображения панели ожидания, но на мгновение прерван операцией графического вывода.
Организация очередей коллбэка — Нажимает Wait (uninterruptible), сразу сопровождаемый Surf Plot (queue). Панель ожидания выполнение до завершения. Затем отображения объемной поверхностной диаграммы.
Отмена коллбэка — Нажимает Wait (uninterruptible), сразу сопровождаемый Mesh Plot (cancel). Панель ожидания выполнение до завершения. Никакой график не отображается, потому что MATLAB отбрасывает коллбэк сетчатого графика.
Interruptible
и BusyAction
свойства передаются как входные параметры uicontrol
функционируйте, когда каждая кнопка будет создана.
Вот команда, которая создает кнопку Wait (interruptible). Заметьте что Interruptible
свойство установлено в 'on'
.
h_interrupt = uicontrol(h_panel1,'Style','pushbutton',... 'Position',[30,110,120,30],... 'String','Wait (interruptible)',... 'Tooltip','Interruptible = on',... 'Interruptible','on',... 'Callback',@wait_interruptible);
Вот команда, которая создает кнопку Wait (uninterruptible). Заметьте что Interruptible
свойство установлено в 'off'
.
h_nointerrupt = uicontrol(h_panel1,'Style','pushbutton',... 'Position',[30,40,120,30],... 'String','Wait (uninterruptible)',... 'Tooltip','Interruptible = off',... 'Interruptible','off',... 'Callback',@wait_uninterruptible);
Вот команда, которая создает кнопку Surf Plot (queue). Заметьте что BusyAction
свойство установлено в 'queue'
.
hsurf_queue = uicontrol(h_panel2,'Style','pushbutton',... 'Position',[30,200,110,30],... 'String','Surf Plot (queue)',... 'BusyAction','queue',... 'Tooltip','BusyAction = queue',... 'Callback',@surf_queue);
Вот команда, которая создает кнопку Mesh Plot (cancel). Заметьте что BusyAction
свойство установлено в 'cancel'
.
hmesh_cancel = uicontrol(h_panel2,'Style','pushbutton',... 'Position',[30,130,110,30],... 'String','Mesh Plot (cancel)',... 'BusyAction','cancel',... 'Tooltip','BusyAction = cancel',... 'Callback',@mesh_cancel);
drawnow
| timer
| uiwait
| waitfor