Как обновить графический интерфейс MATLAB в фоновом режиме? - PullRequest
4 голосов
/ 12 июня 2009

У меня есть графический интерфейс MATLAB и отдельное приложение, которое записывает данные в файл. Я хотел бы, чтобы мой графический интерфейс MATLAB периодически проверял файл и обновлял графический интерфейс при его изменении.

В Java я бы использовал объект SwingUtils.Timer (sp?), Чтобы сделать что-то подобное. Имеет ли MATLAB функцию таймера? Я мог бы написать класс Java и сделать это, я думаю, но хочу что-то быстрое и грязное для демо, предпочтительно чистый MATLAB.

1 Ответ

11 голосов
/ 12 июня 2009

Вы можете создавать объекты таймера в MATLAB, используя функцию TIMER . Например, это создает объект таймера, который должен выполнять функцию myFcn один раз каждые 10 секунд после запуска таймера:

timerObject = timer('TimerFcn',@myFcn,'ExecutionMode','fixedRate',...
                    'Period',10.0);

Таймеры запускаются и останавливаются с использованием функций START и STOP . Вы также должны всегда помнить, чтобы удалить их с помощью DELETE , когда вы закончите их использовать. Вы можете найти больше информации об использовании таймеров в документации MATLAB .

Стоит отметить, что если вы хотите обновить объект осей в графическом интерфейсе GUIDE, для этой работы требуется дополнительная «хитрость». Вы должны либо изменить свойство HandleVisibility объекта axes в GUIDE, либо вы должны явно получить дескриптор. Чтобы сделать это, измените конструкцию timerObject следующим образом (предполагается, что окно осей в GUI, сгенерированном GUIDE, называется axes1):

timerData.axes = handles.axes1;
timerData.n    = 1;                  % some state needed for the plots.
timerObject = timer('TimerFcn',@myFcn,...
                    'ExecutionMode','fixedRate',...
                    'Period',10.0,...
                    'UserData', timerData);

тогда в myFcn нам нужно сослаться на объект осей. В частности:

 function [] = myFcn(timerObj, event)
     timerData = get(timerObj, 'UserData');
     plot(timerData.axes, (1:n)/n, sin(20*2*pi*(1:n)/n));
     line( (1:n)/n, cos(20*2*pi*(1:n)/n, 'Parent', timerData.axes);
     timerData.n = timerData.n + 1;
     set(timerObj, 'UserData', timerData);
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...