Обратный звонок Matlab Timer
Программа ниже содержит timer
определение объекта с последующей командой запуска. Затем программа продолжает выполнять другие операторы.
Мой вопрос TimerFcn
будет назван именно после 0.01
сек, или он будет ждать, пока цикл for завершит работу функции обратного вызова таймера?
% My timer object
t = timer('TimerFcn',@(x,y)G2(z), 'StartDelay',0.01);
start(t);
% Other program statements
for i=1:m
...
end
1 ответ
Суть в том, что MATLAB эффективно однопоточный. Поэтому, если в данный момент выполняется длинная операция, обратный вызов таймера не получит шанса на запуск, и в соответствии со свойствами объекта таймера (читайте BusyMode
), вместо этого добавит событие в очередь, через которую MATLAB в итоге пройдет, когда впервые получит шанс..
Из того, что я понимаю (это мое собственное предположение), таймеры MATLAB могут прерывать выполнение между операторами, но НЕ во время длительных.
Так что в теории это должно работать через 0,01 секунды, но нет никаких гарантий...
В документации сказано следующее:
Примечание. Указанное время выполнения и фактическое выполнение таймера могут различаться, поскольку объекты таймера работают в однопоточной среде выполнения MATLAB. Продолжительность этой временной задержки зависит от того, какую другую обработку выполняет MATLAB. Для принудительного выполнения функций обратного вызова в очереди событий включите в свой код вызов функции drawnow. Функция drawnow очищает очередь событий.
Также есть эта заметка на другой странице документа:
Примечание. Выполнение функции обратного вызова может быть отложено, если обратный вызов включает в себя задачу с интенсивным использованием ЦП, например обновление фигуры.