2016-08-11 48 views
0

我正在使用Mathworks提供的計時器GUIDE回調示例作爲最小工作示例。這些文件可以通過以下方式獲得:即使使用guidata,Matlab GUIDE回調函數也不會更新句柄

copyfile(fullfile(docroot, 'techdoc','creating_guis','examples',... 
'ex_guide_timergui*.*')), fileattrib('ex_guide_timergui*.*', '+w') 

in Matlab。 我修改了示例文件,像這樣:

function startbtn_Callback(hObject, eventdata, handles) 
% hObject handle to startbtn (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% START USER CODE 
% Only start timer if it is not running 
if strcmp(get(handles.timer, 'Running'), 'off') 
    start(handles.timer); 
end 
handles.blip = 1; 
guidata(hObject,handles); 

基本上是建立在手柄上的曇花一現場,當我點擊開始按鈕(開始計時)的例子。然後我通過使用giudata來更新句柄的主版本...或者我想。

我修改了計時器回調函數來測試這一領域:

function update_display(hObject,eventdata,hfigure) 
% Timer timer1 callback, called each time timer iterates. 
% Gets surface Z data, adds noise, and writes it back to surface object. 

handles = guidata(hfigure); 
Z = get(handles.surf,'ZData'); 
Z = Z + 0.1*randn(size(Z)); 
set(handles.surf,'ZData',Z); 
if handles.blip ==1 
    a = 0; 
end 

但是當我運行GUI並開始計時,MATLAB拋出一個錯誤,指出曇花一現不存在作爲一個字段在句柄中(引用不存在的字段'blip')。當我使用guidata更新先前調用的回調中的句柄的主版本,然後使用定時器回調中的guidata(本例中的代碼)檢索這個主版本時,這怎麼可能?我應該有blip字段的更新版本,但我沒有。逐步調試顯示由定時器回調檢索的句柄版本與由打開函數製作的版本相對應,缺少blip字段。 我已經在這個網站上尋找解決這個問題的方法,並使用谷歌,但還沒有找到解釋(或只使用回調而不是函數的方式) - 一些已經成功的功能,但在這裏定時器功能是什麼阻止我從寫一個常規函數來做同樣的事情,並從回調中調用它。

+1

定時器在啓動時立即執行它們的'TimerFcn',所以在設置'handles.blip = 1;'之前執行'update_display'。您對'handles'的修改需要在定時器啓動之前進行。 – excaza

+0

這是正確的!我沒有預料到這一點,並啓動計時器之前更新guidata已解決問題。非常感謝 :)。我會喜歡,但我相信我需要更多的聲譽......我會創建一個答案並接受它,以便其他人可以受益,如果他們有同樣的問題。 –

回答

0

正如在評論中說的那樣:這種情況發生的原因是因爲無論定時器週期是什麼,在MATLAB中啓動計時器時立即調用定時器函數,從而在設置值之前檢查該值。解決方法是在啓動計時器之前更改變量,更新guidata然後啓動計時器(並最終再次更新guidata)。

相關問題