Во время занятости в сценариях с множествами потоков выполнения таймеру может потребоваться добавить функцию обратного вызова таймера (TimerFcn) в MATLAB® очередь выполнения до завершения ранее поставленного в очередь выполнения функции обратного вызова. Можно определить, как объект-таймер обрабатывает этот сценарий, установив 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 | Запустите первое выполнение коллбэка. |
1 | Попытка начать второе выполнение коллбэка. Первое выполнение не завершено, но очередь выполнения пуста. Таймер добавляет коллбэк в очередь. |
1.6 | Завершите выполнение первого обратного вызова и запустите второе. Это действие очищает очередь выполнения. |
2 | Попытка начать выполнение третьего обратного вызова. Второе выполнение не завершено, но очередь пуста. Таймер добавляет коллбэк в очередь. |
3 | Попытка начать выполнение четвертого обратного вызова. Третий коллбэк находится в очереди выполнения, поэтому таймер отбрасывает это выполнение функции. |
3.2 | Завершите второй коллбэк и запустите третий, очистив очередь выполнения. |
4 | Попытка запуска другого выполнения обратного вызова. Поскольку очередь пуста, таймер добавляет коллбэк в очередь. Это пятая попытка, но только четвертый образец, который будет запущен. |
4.8 | Завершите третье выполнение и запустите четвертый образец, очистив очередь. |
5 | Попытка начать другой коллбэк. Выполняется образец, но очередь выполнения пуста, поэтому таймер добавляет ее в очередь. Это пятый образец, который будет запущен. |
6 | Ничего не делайте: значение |
6.4 | Завершите выполнение четвертого обратного вызова и запустите пятый. |
8 | Завершите пятое выполнение обратного вызова. |
The 'error' режим для BusyMode свойство подобно 'drop' mode: В обоих режимах таймер допускает только один образец коллбэка в очереди выполнения. Однако в 'error' mode, когда очередь не пуста, таймер вызывает функцию, которую вы задаете используя 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 | Запустите первое выполнение коллбэка. |
1 | Попытка начать второе выполнение коллбэка. Первое выполнение не завершено, но очередь выполнения пуста. Таймер добавляет коллбэк в очередь. |
1.6 | Завершите выполнение первого обратного вызова и запустите второе. Это действие очищает очередь выполнения. |
2 | Попытка начать выполнение третьего обратного вызова. Второе выполнение не завершено, но очередь пуста. Таймер добавляет коллбэк в очередь. |
3 | Попытка начать выполнение четвертого обратного вызова. Третий коллбэк находится в очереди выполнения. Таймер не выполняет третий коллбэк, а вместо этого вызывает функцию обработки ошибок. |
3.2 | Завершите второй коллбэк и запустите функцию обработки ошибок. |
Если вы задаете 'queue'Объект-таймер ожидает, пока функция обратного вызова выполняющегося в данного момента не концов перед постановкой в очередь следующего выполнения функции обратного вызова таймера.
В 'queue' mode, объект-таймер пытается сделать среднее время между выполнениями равным количеству времени, заданному в Period свойство. Если объект-таймер должен ждать дольше, чем время, заданное в Period свойство между выполнениями коллбэка функции таймера сокращает период времени для последующих выполнений, чтобы компенсировать время.