2016-08-11 4 views
0

Mathworksが提供するタイマーGUIDEコールバックの例を参考にしています。ファイルは、MatlabでMatlab GUIDEコールバックでguidataを使用してもハンドルが更新されない

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

で取得できます。例では、私はスタート押しボタンをクリックしてください(とタイマーを開始)するとき

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を使用してこのマスターバージョンを取得すると、どのようになりますか?私は、ブリップフィールドで更新されたバージョンを持っている必要がありますが、私はしません。ステップバイステップのデバッグでは、タイマーコールバックによって取得されたハンドルバージョンが、opening関数によって作成されたバージョンと一致し、blipフィールドが存在しないことが示されます。 私はこのサイトの問題とGoogleを使って解決策を探しましたが、説明を見つけられませんでした(またはコールバックだけを関数として使用する方法) - 関数で成功した関数もありますが、私は同じことをしてコールバックから呼び出すための通常の関数を書いていません。

+1

タイマーは開始時に 'TimerFcn'をすぐに実行するので、' handles.blip = 1; 'がセットされる前に' update_display'が実行されています。 'handles'への変更は、タイマーが開始される前である必要があります。 – excaza

+0

これは間違いない!私はこれを期待していなかったし、タイマーを起動する前にguidataを更新して問題を修正しました。どうもありがとう :)。私はアップフォートしますが、私はもっと評判が必要だと信じています...私は答えを作成し、それを受け入れて、他の人が同じ問題を抱えていれば利益を得ることができます。 –

答えて

0

コメントとしてexcazaが言ったように、これが起こっている理由は、タイマーが何であるかにかかわらず、タイマー機能がすぐにMATLABで起動され、その値が設定される前にチェックされるからです。この問題を回避するには、タイマーを開始する前に変数を変更し、guidataを更新してからタイマーを起動します(そして最終的にguidataを再度更新します)。

関連する問題