2012-03-02 18 views
6

Sto facendo un semplice visualizzatore di dati in tempo reale con pulsanti come riproduzione, pausa e cursore utilizzando la GUI di MATLAB. Dopo che l'utente preme il cursore di riproduzione, è necessario aggiornare ogni passaggio (50 campioni al secondo). Questa funzionalità interferisce con lo spostamento manuale dello slider (dovresti spostarlo in 1/50 della seconda). Per ora ho impostato l'aggiornamento del cursore ogni 50 volte (quindi una volta al secondo) e funziona bene, a meno che non si tenga il cursore più a lungo di quanto ci vuole per aggiornare.Buttondownfcn non funziona sul dispositivo di scorrimento

Il problema è che se Abilita proprietà slider è attiva, Buttondownfcn non funziona per il clic sinistro (lo fa per quello destro). Usando Buttondownfcn sarei in grado di bloccare l'aggiornamento e risolvere completamente il problema. C'è un modo per aggirare questo?

% --- 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

potresti mostrare qualche codice di esempio minimo? – tim

+1

Se si desidera simulare questo comportamento, avviare la GUI di MATLAB e aggiungere un cursore. Aggiungi Callback e ButtonDownFcn come callback e aggiungi alcuni messaggi stampati come ho fatto usando disp. Quindi basta passare dalla proprietà Enable (on/off) e vedere cosa succede. –

risposta

1

È possibile ottenere il gioco interrupt impostando la proprietà Enable del vostro dispositivo di scorrimento per off o inactive quando si preme il pulsante play e utilizzando una funzione ButtonDownFcn che ferma il gioco e imposta Enable torna a on.

Utilizzando un togglebutton come il mio tasto play (altri widget di controllo dovrebbe funzionare finché è possibile salvare un flag booleano da qualche parte accessibile), ho usato il seguente come Callback per il pulsante:

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 

E la seguente come ButtonDownFcn per il cursore:

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 

È possibile registrare questi callback come questo:

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

Avvertenza: se si inizia ad aggiungere altri widget che interagiscono con il pulsante di scorrimento/riproduzione in modo simile a questo, si aumenta la possibilità di introdurre condizioni di gara.

+0

So che posso farlo ma non saresti in grado di cambiare il tempo mentre i dati vengono riprodotti e non è molto facile da usare :) –

+0

Ok. Penso di non capire completamente come usi il cursore nella tua GUI. Hai un'applicazione di esempio che desideri emulare per mostrare? Finora lo capisco in questo modo: ottieni dati da una fonte esterna (50 volte al secondo); mantieni un buffer di dati per N campioni; il cursore viene utilizzato per selezionare il campione da visualizzare; il display si aggiornerà sempre ogni 1/50 di secondo, a meno che non venga messo in pausa. – AE426082

Problemi correlati