2012-03-02 8 views
6

Tworzę prostą przeglądarkę danych w czasie rzeczywistym z przyciskami takimi jak odtwarzanie, pauza i suwak przy użyciu GUI MATLAB. Po naciśnięciu przez użytkownika suwak odtwarzania musi być aktualizowany co krok (50 próbek na sekundę). Ta funkcja zakłóca ruchomy suwak (musisz go przenieść w 1/50 sekundy). Na razie ustawiam aktualizację suwaka co 50 razy (czyli raz na sekundę) i działa dobrze, chyba że przytrzymasz suwak dłużej niż trwa aktualizacja.Buttondownfcn nie działa na suwaku

Problem polega na tym, że jeśli właściwość suwaka Włącz jest włączona, funkcja Buttondownfcn nie działa dla lewego kliknięcia (dotyczy prawej). Używając Buttondownfcn, będę w stanie zablokować aktualizację i całkowicie rozwiązać problem. Czy jest jakiś sposób obejścia tego?

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

czy możesz pokazać minimalny przykładowy kod? – tim

+1

Jeśli chcesz zasymulować to zachowanie, po prostu uruchom GUI MATLAB i dodaj suwak. Dodaj Callback i ButtonDownFcn jako wywołania zwrotne i dodaj wydrukowane wiadomości, takie jak przy użyciu disp. Następnie przełącz się między właściwością Włącz (wł./Wył.) I zobacz, co się stanie. –

Odpowiedz

1

Można osiągnąć przerwania odtwarzania przez ustawienie właściwości swojego suwaka Enable do off lub inactive kiedy naciśniesz przycisk odtwarzania i za pomocą ButtonDownFcn funkcję, która zatrzymuje grę i ustawia Enable z powrotem do on.

Używanie togglebutton jak mój przycisk odtwarzania (inne widgety kontrolne powinny działać tak długo, jak można zaoszczędzić logiczną flagę gdzieś dostępne), użyłem następujących jak Callback dla przycisku:

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 

I następujących jak ButtonDownFcn na suwaku:

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 

można zarejestrować te wywołania zwrotne tak:

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

Zastrzeżenie: jeśli zaczniesz dodawać inne widżety współdziałające z przyciskiem suwak/odtwarzanie w podobny sposób, zwiększysz swoją szansę na wprowadzenie warunków wyścigu.

+0

Wiem, że mogę to zrobić, ale wtedy nie byłbyś w stanie zmienić czasu, podczas gdy dane są odtwarzane i to nie jest bardzo przyjazne dla użytkownika :) –

+0

Ok. Myślę, że nie do końca rozumiem, w jaki sposób używasz suwaka w GUI. Czy masz przykładową aplikację, którą chcesz emulować, aby ją wyświetlić? Do tej pory rozumiem to w następujący sposób: otrzymujesz dane z zewnętrznego źródła (50 razy na sekundę); przechowujesz bufor danych dla N próbek; suwak służy do wybierania próbki do wyświetlenia; wyświetlacz będzie zawsze aktualizowany co 1/50 sekundy, chyba że jest pauzowany. – AE426082

Powiązane problemy