Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

GUI Stop button problem

Asked by Sebastian on 16 Jan 2013

I am creating a standalone Matlab application, which needs a toggle button that can initiate and stop a looping script.

I was able to implement the basic idea like this in my gui.m file:

function startBtn_Callback(hObject, eventdata, handles)
    if get(handles.startBtn,'Value')
        set(handles.startBtn,'String','Stop Recording');
    else
        set(handles.startBtn,'String','Start Recording');
        disp('Recording Stopped)
    end
    while get(handles.startBtn,'Value');
        disp('looping..');
        pause(.5);
    end

This script works as expected, but when I replace the contents of the while loop the function I would like to loop, the button stops working. It still toggles when I push it, but the callback only gets called the first time the button is pushed. Here is what my final code looks like:

function startBtn_Callback(hObject, eventdata, handles)
    if get(handles.startBtn,'Value')
        set(handles.startBtn,'String','Stop Recording');
        pause(.1);
    else
        set(handles.startBtn,'String','Start Recording');
        disp('Recording Stopped)
    end
    while get(handles.startBtn,'Value');
        myFunction();
    end

When I push the start button, this callback runs and the loop starts. The pause(.1) is needed to get the text to change - if I don't include a pause, the loop initiates, but the text on the button does not change.

After this, no subsequent button pushes do anything. The button toggles on the GUI, but startBtn_Callback never gets called and the loop runs indefinitely. This is a problem because my end user will not have access to the Matlab console.

To give a bit more information about my function: its a method that records audio for 5 seconds, does some processing, then outputs some graphs. I want this loop to repeat indefinitely until the user pushes stop.

I think that the issue is that Matlab seems to only be able to run one function at a time, so when myFunction() is running, the callback can't be initiated. The reason it worked in the first example is because there was a pause between loop calls. I can't have this pause, because a requirement of the project is to record every possible second.

How can I make a reliable stop button for this process?

I am running Matlab R2012b 32-bit

0 Comments

Sebastian

Products

1 Answer

Answer by Sebastian on 18 Jan 2013
Edited by Sebastian on 18 Jan 2013
Accepted answer

drawnow() is the function I was looking for. Putting that after myFunction() forces Matlab to handle any stacked up GUI calls before proceeding with the loop.

This code creates a reliable start/stop toggle button for an indefinite and continuous process:

function startBtn_Callback(hObject, eventdata, handles)
      if get(handles.startBtn,'Value')
          set(handles.startBtn,'String','Stop');
          drawnow();
      else
          set(handles.startBtn,'String','Start');
      end
      while get(handles.startBtn,'Value');
          myFunction();
          drawnow()
      end

1 Comment

Thomas Marullo on 9 Aug 2013

This doesn't work for me. If I click the startBtn, then it gets stuck inside the while loop, clicking the start button again doesn't change its state.

Sebastian

Contact us