Closing gui window *.gif
Mostrar comentarios más antiguos
I created gui that has uipanel with two radio buttons. I'm running two endless loops for each radio button that know to switch on from another smoothly. When I close gui window I get errors as follows:
??? Error using ==> guidata at 89
H must be the handle to a figure or figure descendent.
Error in ==> Demo>uipanel1_SelectionChangeFcn at 262
guidata(hObject, handles);
Error in ==> gui_mainfcn at 96
feval(varargin{:});
Error in ==> Demo at 42
gui_mainfcn(gui_State, varargin{:});
Error in ==>
@(hObject,eventdata)Demo('uipanel1_SelectionChangeFcn',get(hObject,'SelectedObject'),eventdata,guidata(get(hObject,'SelectedObject')))
Error in ==> hgfeval at 63
feval(fcn{1},varargin{:},fcn{2:end});
Error in ==> uitools.uibuttongroup.childAddedCbk>manageButtons at 80
hgfeval(cbk, source, evdata);
??? Error while evaluating uicontrol Callback
Can you suggest what is the proper way to close gui window?
Thanks,
5 comentarios
Jan
el 23 de Jul. de 2012
You cannot run two endless loops in Matlab. One endless loop fills the single Matlab thread already. Therefore please post the relevant code to explain, what you are actually doing.
It seems to be obvious, that you have to stop the loops, before the figure can be closed.
Michael Adelman
el 24 de Jul. de 2012
Jan
el 24 de Jul. de 2012
What does "while button1" mean? Can the value of "button1" be changed from inside the WHILE loop?
Michael Adelman
el 24 de Jul. de 2012
Jan
el 25 de Jul. de 2012
Let me ask again: Do you assume, that the value of button1 or button2 is changed, during Matlab processes the infinite loop? Or in other words, is your function equivalent to:
if button1
while true
...
end
end
Respuestas (3)
Jan
el 24 de Jul. de 2012
A secure solution would be:
- Create two flags in the figure's local data:
setappdata(FigureHandle, 'LoopEntered', false);
setappdata(FigureHandle, 'StopLoop', false);
- Enable a flag, when one of the loops is started:
setappdata(FigureHandle, 'LoopEntered', true)
- When the endless loop is finished (at least when this is not a contradiction...), disable the flag again:
setappdata(FigureHandle, 'LoopEntered', false)
- Inside the CloreRequestFcn and DeleteFcn (called when the figure is closed or deleted) set another flag to stop the loops:
if getappdata(FigureHandle, 'LoopEntered')
setappdata(FigureHandle, 'StopLoop');
while getappdata(FigureHandle, 'LoopEntered')
pause(0.1);
end
end
- Inside the loops, check the stop flag:
while XYZ
if get(FigureHandle, 'StopLoop')
break;
end
...
end
setappdata(FigureHandle, 'LoopEntered', false);
Then you have two dynamic locks: The running loop locks the closing of the figure. Closing the figure blocks the execution of the loop.
2 comentarios
Michael Adelman
el 24 de Jul. de 2012
Jan
el 24 de Jul. de 2012
Even GUIDE figures are 100% full and complete Matlab figures. There is not even one spark of magic added by GUIDE. Therefore it does not matter, if you create the figure directly by a program, or if you let GUIDE create the program to create the figure.
Michael Adelman
el 25 de Jul. de 2012
5 comentarios
Walter Roberson
el 25 de Jul. de 2012
Use ishandle(handles.figure1) to test whether the figure is still valid.
"1. the endless loops never stops, only switches one to other." No, Michael, endless loops do not switch one to the other. They run endless and the other loop cannot be reached. Running an endless loop blocks subsequent events, such when you stop one loop, the pending events are processed and e.g. the next callback is executed.
The idea of the endless loops is simply prone to such problems. It seems like your program tries to perform too many things simultaneously. Using e TIMER would be more promissing. But even then avoiding dead-locks and spinning blocks is not easy. I suggest to choose a simpler design with a reduced number of mutual dependencies.
Even Walter's ishandle test can fail, if for any reasons the figure is deleted after the test, but before the update. A non-spaghetti-structure of the program is definitely better.
Michael Adelman
el 25 de Jul. de 2012
Walter Roberson
el 25 de Jul. de 2012
ishandle() is not valid after deletion.
Michael Adelman
el 25 de Jul. de 2012
Michael Adelman
el 28 de Jul. de 2012
0 votos
Categorías
Más información sobre Migrate GUIDE Apps en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!