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