В течение напряженного времени, в сценариях множества потоков выполнения, таймер может должен быть добавить функцию обратного вызова таймера (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 |