2010-12-19 20 views
8

Pracuję nad projektem w programie MATLAB. Obejmuje on ciągłe nanoszenie danych o temperaturze odbieranej z portu szeregowego komputera. Chcę to robić w nieskończoność, czy istnieje sposób na tworzenie nieskończonych pętli jak w C?Jak mogę pętlę w nieskończoność, ale zatrzymać w niektórych warunkach?

Teraz, jeśli jest zaimplementowany jako:

while(true) 
%comments 
end; 

jak Moore nizej, to czy jest jakiś sposób, aby zaktualizować flagi tak, że może być rozwiązana zgodnie z wymogiem lub innej pracy?

Przykład: Planuję dane dla moich 5 węzłów komunikujących się za pośrednictwem ZigBee, a następnie, jeśli wybrałam do wykreślenia 4 węzłów na osi, to jest jakakolwiek droga po uruchomieniu pętli nieskończonej, dzięki czemu mogę zmienić dane używane wewnątrz pętla poprzez metodę wprowadzania GUI MATLAB lub dowolnej flagi?

Odpowiedz

10

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.

+1

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ść. –

+1

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). –

3
while (true) 
    % block of code here 
end 
+9

Niesamowite! Prawie jak KAŻDY INNY JĘZYK :) –

+0

Mówisz, jak zapętlać na zawsze, ale nie jak wyjść z pętli. –

Powiązane problemy