o „nieskończonej” pętli, które mogą nadal być łatwo zatrzymany, gdy pewien warunek jest spełniony, można skonfigurować while condition być logical variable (tj flagi), które mogą być aktualizowane w Twojej pętli:
keepLooping = true; % A flag that starts as true
while keepLooping
% Read, process, and plot your data here
keepLooping = ...; % Here you would update the value of keepLooping based
% on some condition
end
Pętla while może być również zakończona, jeśli w pętli napotkasz polecenie break
lub return
.
PRZYKŁAD:
Jako przykład niektóre ze sposobów GUI oparte można zatrzymać pętlę, tutaj to program, który tworzy proste GUI, które stale sumujący i wyświetla licznik raz na sekundę za pomocą pętli while. GUI ma dwa sposoby zatrzymania pętli: push button lub naciśnięcie klawisza q, podczas gdy okno rysunku ma fokus (za pomocą 'KeyPressFcn'
property rysunku, aby uruchomić kod po naciśnięciu klawisza). Wystarczy zapisać ten kod w m-pliku gdzieś na ścieżkę MATLAB i uruchomić go przetestować przykład:
function stop_watch
hFigure = figure('Position', [200 200 120 70], ... % Create a figure window
'MenuBar', 'none', ...
'KeyPressFcn', @stop_keypress);
hText = uicontrol(hFigure, 'Style', 'text', ... % Create the counter text
'Position', [20 45 80 15], ...
'String', '0', ...
'HorizontalAlignment', 'center');
hButton = uicontrol(hFigure, 'Style', 'pushbutton', ... % Create the button
'Position', [20 10 80 25], ...
'String', 'Stop', ...
'HorizontalAlignment', 'center', ...
'Callback', @stop_button);
counter = -1;
keepLooping = true;
while keepLooping % Loop while keepLooping is true
counter = counter+1; % Increment counter
set(hText, 'String', int2str(counter)); % Update the counter text
pause(1); % Pause for 1 second
end
%---Begin nested functions---
function stop_keypress(hObject, eventData)
if strcmp(eventData.Key, 'q') % If q key is pressed, set
keepLooping = false; % keepLooping to false
end
end
function stop_button(hObject, eventData)
keepLooping = false; % Set keepLooping to false
end
end
Powyższy przykład wykorzystuje nested functions tak, że zwrotna 'KeyPressFcn'
i przycisk może uzyskać dostęp i zmienić wartość keepLooping
w obszarze roboczym funkcji stop_watch
.
Należy zauważyć, że nie zadziała to bez 'pause' (bez' pause' spowoduje zakończenie pętli, a następnie przetwarzanie zdarzeń oczekujących na oddzwonienie, pokonując cel). Zauważ, że jest to polecenie 'drawnow', które faktycznie przetwarza kolejki, i' pause' wywołuje 'drawnow' (lub ma odpowiednik), więc prawdopodobnie lepiej jest dodać' drawnow 'jawnie obok 'pause', ze względu na czytelność. –
Wpadłem na ten problem, ponieważ używałem dokładniejszego sposobu oczekiwania, opartego na 'java.lang.Thread.sleep (..)' lub 'Object.wait (..)' i 'java.lang.Thread. yield() 'i różni się od' pause', ponieważ metody te nie zawierają wywołania pobocznego dla 'drawnow' (lub odpowiednika). –