В течение напряженного времени, в сценариях множества потоков выполнения, таймер может должен быть добавить функцию обратного вызова таймера (TimerFcn) к MATLAB® очередь выполнения перед ранее выполнением с очередями функции обратного вызова была завершена. BusyMode свойство влияет на поведение только когда ExecutionMode свойство установлено в FixedRate. Для других значений ExecutionMode, там не может перекрывать попытки выполнить функцию обратного вызова таймера, потому что задержка между выполнением всегда относительно завершения предыдущего выполнения.
Можно определить, как объект - таймер обрабатывает этот сценарий путем установки BusyMode свойство использовать один из этих режимов:
Если вы задаете 'drop' как значение BusyMode свойство, объект - таймер добавляет функцию обратного вызова таймера в очередь выполнения только, когда очередь пуста. Если очередь выполнения не пуста, объект - таймер пропускает выполнение коллбэка.
Например, предположите, что вы создаете таймер с периодом 1 секунды, но коллбэк, который требует по крайней мере 1,6 секунд, как показано здесь для mytimer.m.
function mytimer()
t = timer;
t.Period = 1;
t.ExecutionMode = 'fixedRate';
t.TimerFcn = @mytimer_cb;
t.BusyMode = 'drop';
t.TasksToExecute = 5;
t.UserData = tic;
start(t)
end
function mytimer_cb(h,~)
timeStart = toc(h.UserData)
pause(1.6);
timeEnd = toc(h.UserData)
endЭта таблица описывает, как таймер управляет очередью выполнения.
Аппроксимированное прошедшее время (секунды) | Действие таймера | Функциональное выполнение |
|---|---|---|
| 0 (таймер запускаются), | Добавьте TimerFcn очереди таймера | 'none' |
| 0 + задержка очереди | Никакие меры не приняты. | Первый вызов TimerFcn |
| 1 | Попытайтесь добавить 2-й вызов TimerFcn очереди. 1-й вызов TimerFcn все еще запускается, таким образом, 2-й вызов пропущен | |
| 1.6 | Добавьте 2-й вызов TimerFcn очереди | 'none' |
| 1.6 + задержка очереди | Никакие меры не приняты. | 2-й вызов TimerFcn |
| 2 | Попытайтесь добавить 3-й вызов TimerFcn очереди. 2-й вызов TimerFcn все еще запускается, таким образом, 3-й вызов пропущен | |
| 3.2 | Добавьте 3-й вызов TimerFcn очереди. 4-й вызов пропущен | 'none' |
| 3.2 + задержка очереди | Попытайтесь добавить 4-й вызов TimerFcn очереди. 3-й вызов TimerFcn все еще запускается, таким образом, 4-й вызов пропущен | 3-й вызов TimerFcn |
| 3.2 | ||
| 4.8 | Добавьте 4-й вызов TimerFcn очереди. 5-й вызов пропущен | 'none' |
| 4.8 + задержка очереди | Попытайтесь добавить 5-й вызов TimerFcn очереди. 4-й вызов TimerFcn все еще запускается, таким образом, 5-й вызов пропущен | 4-й вызов TimerFcn |
| 4.8 | ||
| 6.4 | Добавьте 5-й вызов TimerFcn очереди. | 'none' |
| 6.4 + задержка очереди | TasksToExecute имеет значение 5 так mytimer больше не имеет коллбэков, чтобы выполниться. | 4-й вызов TimerFcn |
| 8 |
'error' режим для BusyMode свойство похоже на 'drop' режим: В обоих режимах таймер позволяет только один экземпляр коллбэка в очереди выполнения. В 'error' режим, когда очередь непуста, таймер, вызывает функцию, которую вы задаете при помощи ErrorFcn свойство, и затем прекращает обрабатывать. В настоящее время рабочая функция обратного вызова завершается, но коллбэк в очереди не выполняется.
Например, измените mytimer.m (описанный в предыдущем разделе) так, чтобы это включало функцию обработки ошибок и установило BusyMode к 'error'.
function mytimer()
t = timer;
t.Period = 1;
t.ExecutionMode = 'fixedRate';
t.TimerFcn = @mytimer_cb;
t.ErrorFcn = @myerror;
t.BusyMode = 'error';
t.TasksToExecute = 5;
t.UserData = tic;
start(t)
end
function mytimer_cb(h,~)
timeStart = toc(h.UserData)
pause(1.6);
timeEnd = toc(h.UserData)
end
function myerror(h,~)
disp('Reached the error function')
endЭта таблица описывает, как таймер управляет очередью выполнения.
Аппроксимированное прошедшее время (секунды) | Действие таймера | Функциональное выполнение |
|---|---|---|
| 0 (таймер запускаются), | Добавьте TimerFcn очереди таймера | 'none' |
| 0 + задержка очереди | Никакие меры не приняты. | Первый вызов TimerFcn |
| 1 | Попытайтесь добавить 2-й вызов TimerFcn очереди. 1-й вызов TimerFcn все еще запускает так myerror будет поставлен в очередь при завершении первого вызова TimerFcn
| |
| 1.6 | Добавьте myerror очереди | 'none' |
| 1.6 + задержка очереди | Никакие меры не приняты. | myerror называется |
Если вы задаете 'queue', объект - таймер ожидает до концов функции обратного вызова выполняющегося в данного момента прежде, чем поставить следующее выполнение в очередь функции обратного вызова таймера.
В 'queue' режим, объект - таймер пытается заставить среднее время между выполнением равняться количеству времени, заданному в Period свойство. Если объект - таймер должен ожидать дольше, чем время, заданное в Period свойство между выполнением коллбэка таймерной функции, это сокращает период времени для последующего выполнения, чтобы составить время.
Например, измените mytimer.m (описанный в предыдущем разделе) так, чтобы BusyMode установлен в 'queue'.
function mytimer()
t = timer;
t.Period = 1;
t.ExecutionMode = 'fixedRate';
t.TimerFcn = @mytimer_cb;
t.ErrorFcn = @myerror;
t.BusyMode = 'queue';
t.TasksToExecute = 5;
t.UserData = tic;
start(t)
end
function mytimer_cb(h,~)
timeStart = toc(h.UserData)
pause(1.6);
timeEnd = toc(h.UserData)
end
function myerror(h,~)
disp('Reached the error function')
endЭта таблица описывает, как таймер управляет очередью выполнения.
| Аппроксимированное прошедшее время (секунды) | Действие таймера | Функциональное выполнение |
|---|---|---|
| 0 | Запустите первое выполнение коллбэка. | 'none' |
| 0 + задержка очереди | Никакие меры не приняты. | Первый вызов TimerFcn |
| 1 | Попытайтесь запустить 2-е выполнение коллбэка. 1-е выполнение не завершено, и очередь выполнения остается пустой. | |
| 1.6 | Таймер добавляет 2-й коллбэк в очередь | 'none' |
| 1.6 + задержка очереди | Никакие меры не приняты. | 2-й вызов TimerFcn |
| 2 | Попытайтесь добавить 3-е выполнение коллбэка. 2-е выполнение не завершено, и очередь выполнения остается пустой. | |
| 3 | Попытайтесь запустить 4-е выполнение коллбэка. 2-е выполнение не завершено, и очередь выполнения остается пустой. | |
| 3.2 | Закончите 2-е выполнение обратного вызова. Таймер добавляет 3-и и 4-е коллбэки в очередь и выполняет 3-е. Очередь выполнения содержит 4-й коллбэк. | 'none' |
| 3.2 + задержка очереди | Никакие меры не приняты. | 3-й вызов TimerFcn |
| 4 | Попытайтесь запустить 5-е и итоговое выполнение коллбэка. 3-е выполнение не завершено. Очередь выполнения содержит 4-й коллбэк. | |
| 4.8 | Закончите 3-е выполнение обратного вызова. Таймер добавляет 5-е выполнение в очередь и выполняет 4-е. Очередь выполнения содержит 5-й коллбэк. | 'none' |
| 4.8 + задержка очереди | TasksToExecute имеет значение 5 так mytimer больше не имеет коллбэков, чтобы выполниться. | 4-й вызов TimerFcn |
| 6.4 | 'none' | |
| 6.4 + задержка очереди | 5-й вызов TimerFcn | |
| 8 |