Прерывание Выполнения обратного вызова

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 свойства и панель ожидания.

Копирование исходного файла

  1. В MATLAB установите текущую папку в ту, в которой вы имеете доступ к записи.

  2. Выполните эту команду 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);

См. также

| | |

Похожие темы