Создание MATLAB GUI для скрипта с бесконечным циклом - PullRequest
1 голос
/ 24 мая 2019

В настоящее время я работаю над диспетчером вызовов MATLAB manager.m.Этот скрипт содержит бесконечный цикл, который контролирует коммуникационный поток для входящих команд.

Я хотел бы создать окно состояния для этой программы, чтобы пользователь знал, что она работает правильно (например, указывает на хорошее состояние соединения, текущее состояние и т. Д.).Обратите внимание, что я не хочу, чтобы пользователь мог вводить какую-либо информацию из этого графического интерфейса, его единственной целью является отображение.

Я создал простой графический интерфейс пользователя с помощью программы App Designer.Я преобразовал свой скрипт manager.m в функцию, которая вызывается во время запуска графического интерфейса.

Однако я сталкиваюсь с проблемой, заключающейся в том, что, поскольку функция содержит бесконечный цикл, закрытие графического интерфейса на самом деле неубить функцию.По сути, функция просто продолжает цикл / выполнение.

После нескольких неудачных попыток решить проблему, я чувствую, что не использую конструктор приложений с графическим интерфейсом, как это обычно используется.Кажется, что приложения отвечают за циклический аспект и просто контролируют пользовательские вводы для выполнения событий, когда это необходимо.Добавление моего собственного бесконечного цикла в функцию менеджера, кажется, все усложняет.

Итак, мой вопрос: если я хочу создать отображение состояния для сценария MATLAB с бесконечным циклом, какой метод предпочтительней делать?это?

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Если вы просто хотите завершить цикл, вы можете использовать следующее решение:

  1. Добавьте к рисунку команду setappdata(0, 'do_end_loop', 1); следующим образом:

    function figure1_CloseRequestFcn(hObject, eventdata, handles)
    % hObject    handle to figure1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    setappdata(0, 'do_end_loop', 1);
    
    % Hint: delete(hObject) closes the figure
    delete(hObject);
    
  2. В бесконечном цикле используйте do_end_loop = getappdata(0, 'do_end_loop'); и добавьте логику, чтобы разорвать цикл.
    Следующий пример кода является примером бесконечного цикла, который выполняет некоторую работу и прерывается, когда пользователь закрывает графический интерфейс:

    setappdata(0, 'do_end_loop', 0);
    
    counter = 0;
    while (1)
        do_end_loop = getappdata(0, 'do_end_loop');
    
        if (do_end_loop)
            break;
        end   
    
        handles.text1.String = num2str(counter);
        counter = counter + 1;
    
        pause(0.1);
    end
    

(Я поместил цикл в функцию обратного вызова кнопки).

0 голосов
/ 25 мая 2019

Подумав немного об этом, я понял, что MATLAB App Designer можно просто использовать как «дизайнер».Я пошел дальше и создал свой экран дисплея, а затем нажал на опцию «Просмотр кода».

Если вы прокрутите код вниз, вы найдете раздел, который инициализирует все компоненты пользовательского интерфейса.Вы можете просто скопировать этот код и вставить его в свой собственный скрипт.

Этот метод позволяет использовать конструктор перетаскивания MATLAB для генерации кода пользовательского интерфейса, позволяя при этом контролировать поток своей программы черезваш сценарий.

...