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を使って解決策を探しましたが、説明を見つけられませんでした(またはコールバックだけを関数として使用する方法) - 関数で成功した関数もありますが、私は同じことをしてコールバックから呼び出すための通常の関数を書いていません。
タイマーは開始時に 'TimerFcn'をすぐに実行するので、' handles.blip = 1; 'がセットされる前に' update_display'が実行されています。 'handles'への変更は、タイマーが開始される前である必要があります。 – excaza
これは間違いない!私はこれを期待していなかったし、タイマーを起動する前にguidataを更新して問題を修正しました。どうもありがとう :)。私はアップフォートしますが、私はもっと評判が必要だと信じています...私は答えを作成し、それを受け入れて、他の人が同じ問題を抱えていれば利益を得ることができます。 –