Создание и выполнение функций обратного вызова

Введение

Степень использования коллбэков события является обработкой, которую можно выполнить в ответ на события. Вы решаете, какие события вы хотите сопоставить коллбэки с и функции, которые выполняют эти коллбэки.

Этот раздел

Примечание

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

Создание функций обратного вызова

Этот раздел объясняет, как создать функции обратного вызова для TimerFcn, FramesAcquiredFcn, StartFcn, StopFcn, TriggerFcn и коллбэков ErrorFcn.

Функции обратного вызова требуют по крайней мере двух входных параметров:

  • Объект получения изображений

  • Структура события сопоставлена с событием

Функциональный заголовок для этой функции обратного вызова иллюстрирует этот базовый синтаксис.

function mycallback(obj,event)

Первый аргумент, obj, является самим объектом получения изображений. Поскольку объект доступен, можно использовать в функции обратного вызова любую из функций тулбокса, таких как getdata, которые требуют объекта в качестве аргумента. Можно также получить доступ ко всем свойствам объектов.

Второй аргумент, event, является структурой события, сопоставленной с событием. Эта информация о событии принадлежит только событию, которое заставило функцию обратного вызова выполняться. Для полного списка поддерживаемых типов событий и их связанных структур события, смотрите Структуры События.

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

Примечание

Чтобы получить объект и аргументы события и любые дополнительные аргументы, необходимо использовать массив ячеек при определении имени функции как значения свойства коллбэка. Для получения дополнительной информации смотрите Функции обратного вызова Определения.

Запись функции обратного вызова

Чтобы проиллюстрировать, этот пример реализует функцию обратного вызова для полученного кадрами события. Эта функция обратного вызова позволяет вам контролировать кадры, получаемые путем просмотра демонстрационного кадра периодически.

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

function display_frame(obj,event)

sample_frame = peekdata(obj,1);

imagesc(sample_frame);

drawnow; % force an update of the figure window

abstime = event.Data.AbsTime;

t = fix(abstime);

sprintf('%s %d:%d:%d','timestamp', t(4),t(5),t(6))

Чтобы видеть, как эта функция может использоваться в качестве коллбэка, смотрите Просмотр Демонстрационного Кадра.

Определение функций обратного вызова

Вы сопоставляете функцию обратного вызова с определенным событием путем устанавливания значения свойства коллбэка события. Свойства коллбэка поддержки объектов ввода видео для всех типов событий.

Можно задать функцию обратного вызова как значение свойства любым из трех способов:

Следующие разделы предоставляют больше информации о каждой из этих опций.

Примечание

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

Используя вектор символов, чтобы задать функции обратного вызова

Можно задать функцию обратного вызова как вектор символов. Например, этот код задает функцию обратного вызова mycallback как значение свойства StartFcn коллбэка события запуска для объекта vid ввода видео.

vid.StartFcn = 'mycallback';

В этом случае коллбэк оценен в рабочем пространстве MATLAB.

Используя массив ячеек, чтобы задать функции обратного вызова

Можно задать функцию обратного вызова как вектор символов в массиве ячеек.

Например, этот код задает функцию обратного вызова mycallback как значение свойства StartFcn коллбэка события запуска для объекта vid ввода видео.

vid.StartFcn = {'mycallback'};

Чтобы задать дополнительные параметры, включайте их как дополнительные элементы в массиве ячеек.

time = datestr(now,0);
vid.StartFcn = {'mycallback',time};

Первые два аргумента, переданные функции обратного вызова, являются все еще объектом ввода видео (obj) и структура события (event). Дополнительные аргументы следуют за этими двумя аргументами.

Используя Указатели на функции, чтобы задать функции обратного вызова

Можно задать функцию обратного вызова как указатель на функцию.

Например, этот код задает функцию обратного вызова mycallback как значение свойства StartFcn коллбэка события запуска для объекта vid ввода видео.

vid.StartFcn = @mycallback;

Чтобы задать дополнительные параметры, включайте указатель на функцию и параметры как элементы в массиве ячеек.

time = datestr(now,0);
vid.StartFcn = {@mycallback,time};

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

Определение функции тулбокса как коллбэк

В дополнение к определению функций обратного вызова вашего собственного создания можно также задать start, stop или функции тулбокса trigger как коллбэки. Например, это кодовые наборы значение коллбэка события остановки к Image Acquisition Toolbox™ функция start.

vid.StopFcn = @start;

Отключение коллбэков

Если ошибка происходит в выполнении функции обратного вызова, тулбокс отключает коллбэк и отображает сообщение, подобное следующему.

start(vid)
??? Error using ==> frames_cb
Too many input arguments.

Warning: The FramesAcquiredFcn callback is being disabled.

Включить коллбэк, который был отключен, устанавливало значение свойства, сопоставленного с коллбэком, или перезапускает объект.

Просмотр демонстрационного кадра

Этот пример создает объект ввода видео и устанавливает приобретенное имущество функции обратного вызова события кадров на функцию display_frame, созданную в письменной форме Функция обратного вызова.

Пример устанавливает свойство TriggerRepeat объекта к 4 так, чтобы были получены 50 кадров. Когда запущено, пример отображает демонстрационный кадр от полученных данных каждый раз, когда пять кадров были получены.

  1. Создайте объект получения изображений — Этот пример создает объект ввода видео для устройства получения изображений Matrox®. Чтобы запустить этот пример в вашей системе, используйте функцию imaqhwinfo, чтобы получить конструктора Object для вашего устройства получения изображений и заменить тем синтаксисом следующий код.

    vid = videoinput('matrox', 1);
  2. Сконфигурируйте значения свойств — Этот пример устанавливает значение FramesPerTrigger к 30 и свойство TriggerRepeat к 4. Пример также задает как значение коллбэка FramesAcquiredFcn функция обратного вызова события display_frame, созданный в письменной форме Функция обратного вызова. Объект выполнит FramesAcquiredFcn каждые пять кадров, как задано значением свойства FramesAcquiredFcnCount.

    vid.FramesPerTrigger = 30;
    vid.TriggerRepeat = 4;
    vid.FramesAcquiredFcnCount = 5;
    vid.FramesAcquiredFcn = {'display_frame'};
  3. Получите данные — Запускают объект ввода видео. Каждый раз, когда пять кадров получены, объект выполняет функцию обратного вызова display_frame. Эта функция обратного вызова отображает последний раз полученный кадр, регистрируемый к буферу памяти.

    start(vid)
  4. Вымойтесь — Всегда удаляют объекты получения изображений из памяти и переменные, которые ссылаются на них, когда вам больше не нужны они.

    delete(vid)
    clear vid