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

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

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

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

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

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

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

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

Когда Interruptible объекта свойство установлено в 'on', его коллбэк может быть прерван при следующем вхождении одной из этих команд: drawnowфигураgetframewaitforприостановка, или 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);

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

| | |

Похожие темы