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

Введение

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

Этот раздел

Примечание

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

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

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

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

  • Объект сбора изображений

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

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

function mycallback(obj,event)

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

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

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

Примечание

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

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

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

Чтобы реализовать эту функцию, функция обратного вызова получает одну систему координат данных и отображает полученную систему координат в MATLAB® окно рисунка. Функция также обращается к структуре события, переданной в качестве аргумента, чтобы отобразить временную метку отображаемой системы координат. The 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 тулбокс функционирует как коллбэки. Для примера этот код устанавливает значение события stop коллбэка в 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 функция, созданная в Writing a Функция Обратного Вызова.

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

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

    vid = videoinput('matrox', 1);
  2. Сконфигурируйте значения свойств - Этот пример устанавливает FramesPerTrigger значение для 30 и TriggerRepeat свойство для 4. Пример также задает в качестве значения FramesAcquiredFcn коллбэк функции обратного вызова события display_frame, созданный в Writing a Функция Обратного Вызова. Объект выполнит 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