Saturday, 14 June 2014

Matlab - Guide - Cómo salir de un bucle "while" al pulsar un botón

Si estás desarrollando un programa en Matlab, utilizando "Guide" para ello, y quieres que al pulsar un botón se pare la ejecución de un bucle "while" hay una forma de hacerlo.


If you are developing a Matlab program using "Guide" for it and you want to stop the execution of a loop when you push a button, there is a way to do it.


La solución me la dió Doug. Puedes verlo aquí: 
http://blogs.mathworks.com/videos/2010/12/03/how-to-loop-until-a-button-is-pushed-in-matlab/ (the solution was given by Doug. You can see it here)

Un ejemplo similar sería el siguiente (el boton que se pulsa se llama "boton", es decir, su tag es "boton". Perdón por la falta de originalidad):

% --- Executes on button press in boton.
function boton_Callback(hObject, eventdata, handles)
i=0;
while get(hObject,'Value')
    % Esto hará que al pulsar el boton se reiniciaria la cuenta desde 0 (hará que se ejecute de nuevo la función)
    % También se puede usar: while get(handles.boton,'Value')
    disp(i);
    i=1+i;

    pause(0.5); % En segundos. También puedes usar 0.000001; por ejemplo. Lo importante es que
    % el comando "pause" esté presente pues sino no funcionará. Si no se pone "pause" el programa
    % sigue ejecutandose sin parar pues no se da tiempo al programa a pararse (de ahí el "pause") para 
    % ver si se ha pulsado el boton.

    if i==30
        break; %Utilizó esto para acabar el programa se pulse o no el boton. Si se pulsa el boton
        % antes de llegar a 30 simplemente se reinicia esta función y la cuenta empieza de nuevo desde cero.
    end
end

Al ejecutar este programa y pulsar el botón empieza una cuenta desde 0 hasta 29 que se va mostrando en la pantalla del Matlab. Si se pulsa el boton de nuevo antes de acabar la cuenta se reinicia la cuenta, es decir, empieza desde 0 otra vez.

En base a su solución aquí teneis un ejemplo de como hacer que con un mismo botón se pueda poner en marcha y parar un bucle:

% --- Executes on button press in boton.
function boton_Callback(hObject, eventdata, handles)

if strcmp(get(handles.boton,'String'),'conectar')
    set(handles.boton,'String','desconectar');
     i=0;
    while get(hObject,'Value')
        disp(i);
        i=1+i;
        pause(0.5);
        if i==30
            break;
        end
    end
else
    set(handles.boton,'String','conectar');
end

Observar que al pulsar el botón su texto cambia, así si no se ha pulsado todavía aparecerá "conectar" y si se pulsa su texto cambia a "desconectar".