Как я могу зацикливаться до бесконечности, но остановиться на некоторых условиях? - PullRequest
8 голосов
/ 19 декабря 2010

Я работаю над проектом в MATLAB. Он включает в себя непрерывное отображение данных о температуре, полученных от последовательного порта компьютера. Я хочу делать это бесконечно, поэтому есть ли способ создать бесконечные циклы, как в C?

Теперь, если реализовано как:

while(true)
%comments
end;

Как сказал Мур ниже, есть ли способ обновить флаги, чтобы они могли быть отменены в соответствии с требованием или любой другой операцией?

Пример: я строю данные для своих 5 узлов, обменивающихся данными через ZigBee, тогда, если те, которые я выбрал для построения 4 узлов на Axis, есть ли способ после запуска бесконечного цикла, чтобы я мог изменить данные, используемые внутри цикл через метод ввода GUI MATLAB или любой флаг?

Ответы [ 2 ]

10 голосов
/ 19 декабря 2010

Для "бесконечного" цикла, который все еще может быть легко остановлен при выполнении определенного условия, вы можете установить , в то время как условие будет логической переменной (т. Е. Флаг) которые могут быть обновлены в вашем цикле:

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

Цикл while также может быть прерван, если в цикле встречается команда break или return.


Пример:

В качестве примера некоторых из основанных на GUI способов, которыми вы можете остановить цикл, вот программа, которая создает простой графический интерфейс, который непрерывно увеличивается и отображает счетчик раз в секунду, используя цикл while. В графическом интерфейсе есть два способа остановить цикл: кнопка или нажатие q , когда окно рисунка находится в фокусе (используя свойство 'KeyPressFcn' рисунка запустить код при нажатии клавиши). Просто сохраните этот код в m-файле где-нибудь по пути MATLAB и запустите его, чтобы проверить пример:

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

В приведенном выше примере используются вложенные функции , так что обратный вызов 'KeyPressFcn' и кнопка могут получить доступ и изменить значение keepLooping в рабочем пространстве функции stop_watch.

3 голосов
/ 19 декабря 2010
while (true)
    % block of code here
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...