Вот пример использования таймера с обратным вызовом timerFcn. Я сделал простой графический интерфейс с 1 осями и 1 кнопкой.
В функции открытия я инициализирую график и создаю таймер. При обратном вызове кнопки запуска я запускаю таймер и начинаю манипулировать данными. Функция обратного вызова таймера просто обновляет y-данные строки через ее дескриптор. Ниже приведены соответствующие функции из M-файла графического интерфейса пользователя (разрезанный раздел init и вывод fcn.
function testTimer_OpeningFcn(hObject, eventdata, handles, varargin)
global y x
x = 0:.1:3*pi; % Make up some data and plot
y = sin(x);
handles.plot = plot(handles.axes1,x,y);
handles.timer = timer('ExecutionMode','fixedRate',...
'Period', 0.5,...
'TimerFcn', {@GUIUpdate,handles});
handles.output = hObject;
guidata(hObject, handles);
% --- Executes on button press in startButton.
function startButton_Callback(hObject, eventdata, handles)
global y x
start(handles.timer)
for i =1:30
y = sin(x+i/10);
pause(1)
end
function GUIUpdate(obj,event,handles)
global y
set(handles.plot,'ydata',y);
Возможно, вы захотите, чтобы кнопка «Стоп» остановила таймер в зависимости от структуры вашего графического интерфейса и от того, как / как обновляются данные.
Edit: Basic обрабатывает информацию, кое-что из этого довольно простое, и вы, возможно, уже знаете это:
Отдельный дескриптор объекта содержит набор свойств, которые вы можете прочитать с помощью функции get () или установить с помощью функции set (). Так, например, может быть, я захотел изменить текст startButton по какой-то причине в моем графическом интерфейсе.
set(handles.startButton,'String','Something Other Than Start');
Возможно, вы просто захотите установить точку останова в своем коде где-нибудь (возможно, нажатием кнопки) и поэкспериментировать со структурой дескрипторов. Выполнение get()
команд на различных объектах для изучения их свойств.
Теперь структура дескрипторов содержит все ... umm ... дескрипторы объектов вашего GUI, а также любые пользовательские элементы, которые могут быть удобны для хранения там. Большинство обратных вызовов GUI автоматически передаются через структуру дескрипторов, поэтому у вас есть легкий доступ ко всем частям GUI.
Ex. Обратный вызов startButton был автоматически передан handles
. Так что у меня был легкий доступ к объекту таймера через handles.timer
.
Что заставляет меня вставлять нестандартные вещи в handles
. В функции открытия я добавил новый элемент в структуру дескрипторов handles.timer
и handles.plot
, потому что я знал, что они будут полезны для других обратных вызовов (таких как нажатие кнопки и обратный вызов timerFcn).
Однако для постоянного хранения этих вещей вам необходимо использовать функцию «guidata». Эта функция в основном либо сохраняет измененную структуру handles
, либо получает копию handles
в зависимости от того, как вы ее называете. Поэтому следующая строка в функции открытия сохраняет измененную структуру дескрипторов (добавлены .timer и .plot) в основной графический интерфейс.
guidata(hObject,handles);
Как правило, каждый раз, когда вы добавляете что-то в handles
, у вас должна быть эта строка, чтобы сделать изменение постоянным.
Теперь другой метод вызова:
handles = guidata(hObject); %hObject can be any handle who is a child of the main GUI.
При этом будет получена структура дескрипторов для графического интерфейса.
И последний handles.output = hObject
- это просто вывод по умолчанию при запуске вашего графического интерфейса. Если вы вызываете свой графический интерфейс через командную строку Matlab, как это h = myGUI;
, он должен вернуть дескриптор в ваш графический интерфейс.