2012-03-02 19 views
6

Estoy haciendo un simple visor de datos en tiempo real con botones como reproducir, pausar y deslizar utilizando la GUI de MATLAB. Después de que el usuario presiona play, el control deslizante debe actualizarse en cada paso (50 muestras por segundo). Esa funcionalidad está interfiriendo con el deslizador que se mueve manualmente (tendrías que moverlo en 1/50 de segundo). Por ahora he configurado la actualización del control deslizante cada 50ª vez (por lo que una vez por segundo) y funciona bien, a menos que mantenga el control deslizante más tiempo, lleva la actualización.Buttondownfcn no funciona en el control deslizante

El problema es que si la propiedad del control deslizante Habilitar está activada, Buttondownfcn no funciona para el clic izquierdo (lo hace para el correcto). Usando Buttondownfcn podría bloquear la actualización y resolver el problema por completo. ¿Hay alguna forma de evitar esto?

% --- Executes on slider movement. 
function slider_Callback(hObject, eventdata, handles) 
disp('Slider movement') 

% --- Executes on button down. 
function slider_ButtonDownFcn(hObject, eventdata, handles) 
disp('Button down') 
+3

¿podría mostrar algún código de ejemplo mínimo? – tim

+1

Si desea simular este comportamiento, simplemente inicie la GUI de MATLAB y agregue un control deslizante. Agregue Callback y ButtonDownFcn como devoluciones de llamada y agregue algunos mensajes impresos como lo hice usando disp. Luego simplemente cambie entre la propiedad Habilitar (activar/desactivar) y vea qué sucede. –

Respuesta

1

Puede alcanzar una reproducción de interrupción al establecer la propiedad Enable de su deslizador para off o inactive cuando se pulsa el botón de reproducción y el uso de una función ButtonDownFcn que detiene el juego y establece Enable de nuevo a on.

El uso de un togglebutton como mi botón de reproducción (otros widgets de control debería funcionar todo el tiempo que puede ahorrar una bandera booleana en algún lugar accesible), he utilizado la siguiente como Callback para el botón:

function playcallback(toggle_button, ~, slider_) 
set(slider_, 'Enable', 'inactive'); %slider is disabled 
while get(toggle_button, 'Value') %Value is used as flag for playing 
    current_value = get(slider_, 'Value'); 
    set(slider_, 'Value', rem(current_value + 0.01, 1)); %shift slider (looping) 
    pause(1/50); 
end 
set(slider_, 'Enable', 'on'); %done playing, turn slider back on 
end 

Y la siguiente ButtonDownFcn como para la corredera:

function stopslide(~, ~, toggle_button) 
%play flag off: in playcallback, the while loop stops, 
%the slider is enabled and the playcallback function returns 
set(toggle_button, 'Value', 0); 
end 

puede registrar estas devoluciones de llamada de esta manera:

set(toggle_button_handle, 'Callback', {@playcallback, slider_handle}); 
set(slider_handle, 'ButtonDownFcn', {@stopslide, toggle_button_handle}); 

Advertencia: si comienza a agregar otros widgets interactuando con el control deslizante/botón de reproducción de una manera similar a esto, aumenta las posibilidades de introducir condiciones de carrera.

+0

Sé que puedo hacerlo pero no podrá cambiar el tiempo mientras se reproducen los datos y no es muy fácil de usar :) –

+0

Ok. Creo que no entiendo completamente cómo usas el control deslizante en tu GUI. ¿Tienes una aplicación de ejemplo que quieras emular para mostrar? Hasta ahora lo entiendo de la siguiente manera: se obtienen datos de una fuente externa (50 veces por segundo); mantienes un buffer de datos para N muestras; el control deslizante se usa para elegir qué muestra mostrar; la pantalla siempre se actualizará cada 1/50 de segundo, a menos que esté en pausa. – AE426082

Cuestiones relacionadas