MATLAB ® позволяет контролировать возможность прерывания функции обратного вызова во время ее выполнения. Например, можно разрешить пользователям останавливать цикл анимации, создавая обратный вызов, прерывающий анимацию. В других случаях может потребоваться предотвратить возможные прерывания, если важен порядок выполнения обратного вызова. Например, вы можете предотвратить прерывания для WindowButtonMotionFcn обратный вызов, отображающий различные разделы изображения.
Функции обратного вызова выполняются в соответствии с их порядком в очереди. Если выполняется обратный вызов и действие пользователя инициирует второй обратный вызов, второй обратный вызов пытается прервать первый обратный вызов. Первый обратный вызов - это выполняющийся обратный вызов. Второй обратный вызов - это обратный вызов с прерыванием.
Два значения свойств управляют ответом на попытку прерывания:
Interruptible свойство объекта, владеющего выполняющимся обратным вызовом, определяет, разрешено ли прерывание. Значение 'on' позволяет прервать работу. Значение 'off' не допускает прерывания. Значение по умолчанию: 'on'.
Если прерывание не разрешено, то BusyAction свойство (объекта, владеющего прерывистым обратным вызовом) определяет, ставит ли MATLAB в очередь или отбрасывает прерывистый обратный вызов. Значение 'queue' позволяет выполнить обратный вызов с прерыванием после завершения выполнения обратного вызова. Значение 'cancel' отменяет прерывистый обратный вызов. Значение по умолчанию: 'queue'.
Когда объект Interruptible свойство имеет значение 'on', его обратный вызов может быть прерван при следующем появлении одной из следующих команд: drawnow, figure, getframe, waitfor, pause, или 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 (прерывание), а затем кнопку Surf Plot (очередь) или Mesh Plot (отмена). Панель ожидания отображается, но на мгновение прерывается операцией печати.
Постановка в очередь обратного вызова - немедленно нажмите кнопку «Ожидание» (бесперебойное), а затем нажмите кнопку «График перехода» (очередь). Панель ожидания завершается. Затем отображается график поверхности.
Отмена обратного вызова (Callback cancellation) - немедленно нажмите кнопку «Wait (unintruptible)», а затем нажмите кнопку «Mesh Plot (cancel)» ( Панель ожидания завершается. График не отображается, поскольку MATLAB отменяет обратный вызов графика сетки.
Interruptible и BusyAction свойства передаются в качестве входных аргументов в uicontrol при создании каждой кнопки.
Вот команда, которая создает кнопку Wait (прерывание). Обратите внимание, что 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 (бесперебойный). Обратите внимание, что 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