Closing gui window *.gif

Asked by Michael Adelman on 23 Jul 2012
Latest activity Answered by Michael Adelman on 28 Jul 2012

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 Comments

Jan Simon on 24 Jul 2012

What does "while button1" mean? Can the value of "button1" be changed from inside the WHILE loop?

Michael Adelman on 24 Jul 2012

yes.

button1 or button2 values taken from 'uibuttongroup' panel and then passed to the loops.

Jan Simon on 25 Jul 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
Michael Adelman

Tags

Products

No products are associated with this question.

3 Answers

Answer by Jan Simon on 24 Jul 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 Comments

Michael Adelman on 24 Jul 2012

Hello Jan,

does it matter if I use guide to create gui (for example, figure local data)?

does the code might change?

thanks,

Jan Simon on 24 Jul 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.

Jan Simon
Answer by Michael Adelman on 25 Jul 2012

Hello Jan,

I followed your suggestion with small adjustments:

1. the endless loops never stops, only switches one to other. Because of that, I left in the CloseRequestFcn and DeleteFcn used these two lines:

if getappdata(handles.figure1, 'LoopEntered')
  setappdata(handles.figure1, 'StopLoop', true);
end

2. Once I was able to stop the endless loop, I used these two lines at the end of each endless loop:

setappdata(handles.figure1, 'LoopEntered', false);
delete(handles.figure1);

to delete the window - I get no errors here.

3. Once I deleted figure1, from unknown reason the pointer returns back to the loop and tries to execute the condition that stops endless loop, attached list of errors:

    ??? Error using ==> getappdata
    Invalid object handle
    Error in ==> Demo>uipanel1_SelectionChangeFcn at 266
            if getappdata(handles.figure1, 'StopLoop')
    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 using ==> pause
    Error while evaluating uicontrol Callback
    ??? Error using ==> getappdata
    Invalid object handle
    Error in ==> Demo>uipanel1_SelectionChangeFcn at 352
            if getappdata(handles.figure1, 'StopLoop')
    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 using ==> drawnow
    Error while evaluating uicontrol Callback
    ??? Error using ==> getappdata
    Invalid object handle
    Error in ==> Demo>uipanel1_SelectionChangeFcn at 266
            if getappdata(handles.figure1, 'StopLoop')
    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

Please advice.

5 Comments

Michael Adelman on 25 Jul 2012

Walter,

if ishandle(handles.figure1) is valid after deletion, how to force deletion?

Walter Roberson on 25 Jul 2012

ishandle() is not valid after deletion.

Michael Adelman on 25 Jul 2012

Jan, what you say that I need to update before deleting an object?

It's a good idea to use TIMER, but I don't know to use it properly. Once I'll study this I will send some feedbacks about that.

Michael Adelman
Answer by Michael Adelman on 28 Jul 2012

Thank you for your help.

I finally got this the way I want it. Using flags of 'LoopEntered' and 'StopLoop' get the job done. Now I can continue to the next step of the code.

Michael

0 Comments

Michael Adelman

Contact us