2016-08-04 7 views
0

У меня есть графический интерфейс в MATLAB, который содержит таймер. Я хочу, чтобы каждый раз, когда таймер вызывается для увеличения индекса на единицу, и сохраняйте его в директивах. Я бы хотел, чтобы функциональность возвращалась назад, если это необходимо, поэтому просто использование поля TasksExecuted не будет работать. Моя проблема в том, что индекс просто не увеличивается. Это декларация таймераGUIData не обновляется должным образом

handles.index= 1 ; 
handles.timer = timer(... 
'ExecutionMode', 'fixedRate', ... % Run timer repeatedly 
'Period', 1, ...    % Initial period is 1 sec. 
'TimerFcn', {@update_display,hObject,handles}); % Specify callback 

И это важная часть функции.

function update_display(hObject,eventdata,hfigure,handles) 
tin = evalin('base','t_in'); 
curtime = tin.time(handles.index); 
fprintf('%f',handles.index); 
index = handles.index; 

...

handles.index = index+1 
guidata(handles.figure1,handles); 

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

Спасибо.

ответ

1

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

function testcode 
handles.mainwindow = figure(); 

handles.idx = 1; 

handles.button1 = uicontrol('Style','pushbutton', 'String', 'Button1', ... 
    'Units','normalized', 'Position', [0.05 0.05 .30 .90], ... 
    'Callback', {@button, handles} ... 
    ); 
handles.button2 = uicontrol('Style','pushbutton', 'String', 'Button2', ... 
    'Units','normalized', 'Position', [0.35 0.05 .30 .90], ... 
    'Callback', {@button, handles} ... 
    ); 
handles.button3 = uicontrol('Style','pushbutton', 'String', 'Button3', ... 
    'Units','normalized', 'Position', [0.65 0.05 .30 .90], ... 
    'Callback', {@button, handles} ... 
    ); 
end 

function button(hObj,~,handles) 
fprintf('Initial idx: %u\n', handles.idx); 
handles.idx = handles.idx + 1; 
guidata(hObj, handles); 
tmp = guidata(hObj); 
fprintf('Stored idx: %u\n', tmp.idx); 
end 

Нажмите каждую кнопку и проверьте отображаемый результат.

Чтобы обойти эту проблему, вы можете использовать guidata в update_display, чтобы получить и сохранить вашу handles структуру, а не передавая его в явном виде:

handles.index = 1; 
handles.timer = timer(... 
'ExecutionMode', 'fixedRate', ... % Run timer repeatedly 
'Period', 1, ...    % Initial period is 1 sec. 
'TimerFcn', {@update_display,hObject}); % Specify callback 
guidata(handles.figure1, handles); 

и

function update_display(hObject,eventdata,hfigure) 
handles = guidata(hfigure); 
guidata(handles.figure1, handles); 
tin = evalin('base','t_in'); 
curtime = tin.time(handles.index); 
fprintf('%f',handles.index); 
index = handles.index; 

% ... do things 

handles.index = index+1 
guidata(handles.figure1,handles); 

Если это GUI GUIDE, изменение структуры handles может иметь непреднамеренные последствия. Я бы рекомендовал вместо использования setappdata и getappdata:

setappdata(hObject, 'index', 1); % Assuming hObject is your figure window 
handles.timer = timer(... 
'ExecutionMode', 'fixedRate', ... % Run timer repeatedly 
'Period', 1, ...    % Initial period is 1 sec. 
'TimerFcn', {@update_display,hObject}); % Specify callback 

и

function update_display(hObject,eventdata,hfigure) 
index = getappdata(hfigure, 'index'); 
% ... do things 
index = index + 1; 
setappdata(hfigure, 'index', index); 
+0

Это, кажется, работает. спасибо –

Смежные вопросы