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

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

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

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

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

  • Свойство «Прерывание» объекта, имеющего текущий обратный вызов, определяет, разрешено ли прерывание. Значение '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 (прерываемый) сразу сопровождаемый любой кнопкой во втором окне: График Surf (очередь) или Сетчатый график (отмена). Отображения панели ожидания, но на мгновение прерван операцией графического изображения.

  • Организация очередей обратного вызова — Нажимает Wait (бесперебойный) сразу сопровождаемый Графиком Surf (очередь). Панель ожидания выполнение до завершения. Затем отображения объемной поверхностной диаграммы.

  • Отмена обратного вызова — Нажимает Wait (бесперебойный) сразу сопровождаемый Сетчатым графиком (отмена). Панель ожидания выполнение до завершения. Никакой график не отображается, потому что MATLAB отбрасывает обратный вызов сетчатого графика.

Исследование исходного кода

Свойства Interruptible и BusyAction передаются как входные параметры функции uicontrol, когда каждая кнопка создается.

Вот команда, которая создает Ожидание (прерываемая) кнопка. Заметьте что 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);

Вот команда, которая создает Ожидание (бесперебойная) кнопка. Заметьте что 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 (очередь) кнопка. Заметьте что 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);

Вот команда, которая создает Сетчатый график (отмена) кнопка. Заметьте что 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);

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

| | |

Похожие темы

Была ли эта тема полезной?