MATLAB® позволяет вам контролировать, можно ли прерывать функцию обратного вызова во время ее выполнения. Например, можно разрешить пользователям останавливать цикл анимации, создавая коллбэк, который прерывает анимацию. В другое время можно хотеть предотвратить потенциальные прерывания, когда важен порядок выполняемого коллбэка. Например, вы можете предотвратить прерывания для WindowButtonMotionFcn
коллбэк, который показывает различные разделы изображения.
Функции обратного вызова выполняются в соответствии с их порядком в очереди. Если коллбэк выполняется, и действие пользователя инициирует второй коллбэк, второй коллбэк пытается прервать первый коллбэк. Первый коллбэк - это running callback. Второй коллбэк - это interrupting callback.
Два значения свойств управляют ответом на попытку прерывания:
The Interruptible
свойство объекта, имеющего текущий коллбэк, определяет, разрешено ли прерывание. Значение 'on'
позволяет прерывание. Значение 'off'
не допускает прерывания. Значение по умолчанию 'on'
.
Если прерывание не разрешено, BusyAction
свойство (объекта, имеющего прерывающий обратный вызов) определяет, будет ли MATLAB ставить в очередь или отбрасывать прерывание обратного вызова. Значение 'queue'
позволяет выполнить прерывание обратного вызова после выполнения коллбэка концов выполнения. Значение 'cancel'
отменяет прерывание обратного вызова. Значение по умолчанию 'queue'
.
Когда объект Interruptible
для свойства задано значение 'on'
, его коллбэк может быть прерван при следующем вхождении одной из следующих команд: drawnow
, figure
, getframe
, waitfor
, pause
, или waitbar
.
Если текущий коллбэк содержит одну из этих команд, MATLAB останавливает выполнение текущего коллбэка и выполняет прерывание обратного вызова. MATLAB возобновляет выполнение текущего коллбэка после завершения прерывания обратного вызова.
Если текущий коллбэк не содержит одну из этих команд, MATLAB завершает выполнение коллбэка без прерывания.
Для получения дополнительной информации о прерываемом свойстве и его последствиях смотрите Interruptible
описание свойства на странице свойств UIControl.
В этом примере показано, как управлять прерыванием коллбэка с помощью Interruptible
и BusyAction
свойства и панель ожидания.
В MATLAB установите текущую папку в ту, в которой вы имеете доступ к записи.
Выполните эту команду MATLAB:
copyfile (fullfile (docroot, 'techdoc', 'creating _ guis', 'примеры',...
callback _ interrupt.m ')), fileattrib (' коллбэк _ interrupt.m ',' + w ');
Выполните команду, callback_interrupt
. В программе отображаются два окна.
Нажатие на определенные пары кнопок демонстрирует эффект различных комбинаций значений свойств:
Прерывание коллбэка - Нажмите Wait (interruptible) сразу после чего или кнопка во втором окне: Surf Plot (queue) или Mesh Plot (cancel). Панель ожидания отображается, но на мгновение прерывается операцией графического изображения.
Коллбэк построение очередей - Нажатие кнопки Wait (uninterruptible) сразу же с последующим Surf Plot (queue). Полоса ожидания выполняется до своего завершения. Затем объемная поверхностная диаграмма отображений.
Коллбэки отмены - Нажатие кнопки Wait (uninterruptible) сразу после чего Mesh Plot (cancel). Полоса ожидания выполняется до своего завершения. График не отображается, потому что MATLAB отбрасывает коллбэк сетчатый график.
The 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