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

MATLAB® позволяет вам управлять, может ли функция обратного вызова быть прервана, в то время как это выполняется. Например, можно позволить пользователям останавливать цикл анимации путем создания коллбэка, который прерывает анимацию. В других случаях вы можете хотеть предотвратить потенциальные прерывания, когда порядок рабочего коллбэка важен. Например, вы можете предотвратить прерывания для коллбэка WindowButtonMotionFcn, который показывает различные разделы изображения.

Как управлять прерыванием

Функции обратного вызова выполняются согласно их порядку в очереди. Если коллбэк выполняется, и пользовательское действие инициировало второй коллбэк, второй коллбэк пытается прервать первый коллбэк. Первым коллбэком является running callback. Вторым коллбэком является interrupting callback.

Два значений свойств управляют ответом на попытку прерывания:

  • Свойство «Прерывание» объекта, имеющего текущий обратный вызов, определяет, разрешено ли прерывание. Значение 'on' позволяет прерывание. Значение 'off' не позволяет прерывание. Значением по умолчанию является 'on'.

  • Если прерывание не позволено, то свойство BusyAction (объекта, владеющего прерыванием обратного вызова), определяет, ставит ли MATLAB в очередь или отбрасывает прерывание обратного вызова. Значение 'queue' позволяет прерыванию обратного вызова выполняться после рабочего выполнения концов коллбэка. Значение 'cancel' отбрасывает прерывание обратного вызова. Значением по умолчанию является 'queue'.

Поведение обратного вызова, Когда Прерывание Позволено

Когда свойство Interruptible объекта установлено в 'on', его коллбэк может быть прерван при следующем вхождении одной из этих команд: drawnow, figure, getframe, waitfor, pause или waitbar.

  • Если рабочий коллбэк содержит одну из этих команд, то MATLAB останавливает выполнение рабочего коллбэка и выполняет прерывание обратного вызова. MATLAB возобновляет выполнение обратного вызова при завершении прерывания.

  • Если текущий обратный вызов не содержит одну из этих команд, MATLAB завершает выполнение обратного вызова без прерывания.

Для получения дополнительной информации о прерываемом свойстве и его эффектах, см. описание свойства Interruptible на странице UIControl Properties.

Пример

Этот пример показывает, как управлять прерыванием коллбэка с помощью свойств Interruptible и BusyAction и панели ожидания.

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

  1. В MATLAB, устанавливает ваша текущая папка на ту, в которой у вас есть доступ для записи.

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

Смотрите также

| | |

Похожие темы