В напряженное время, в сценариях множества потоков выполнения, таймер, возможно, должен добавить функцию обратного вызова таймера (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 | Закончите пятое выполнение обратного вызова. |
Режим '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 | Запустите первое выполнение коллбэка. |
1 | Попытайтесь запустить второе выполнение коллбэка. Первое выполнение не завершено, но очередь выполнения пуста. Таймер добавляет коллбэк в очередь. |
1.6 | Закончите первое выполнение обратного вызова и запустите второе. Это действие очищает очередь выполнения. |
2 | Попытайтесь запустить третье выполнение обратного вызова. Второе выполнение не завершено, но очередь пуста. Таймер добавляет коллбэк в очередь. |
3 | Попытайтесь запустить четвертое выполнение обратного вызова. Третий коллбэк находится в очереди выполнения. Таймер не выполняет третий коллбэк, но вместо этого вызывает функцию обработки ошибок. |
3.2 | Закончите второй коллбэк и запустите функцию обработки ошибок. |
Если вы задаете 'queue'
, объект - таймер ожидает до концов функции обратного вызова выполняющегося в данного момента прежде, чем поставить следующее выполнение в очередь функции обратного вызова таймера.
В режиме 'queue'
объект - таймер пытается заставить среднее время между выполнением равняться количеству времени, заданному в свойстве Period
. Если объект - таймер должен ожидать дольше, чем время, заданное в свойстве Period
между выполнением коллбэка таймерной функции, это сокращает период времени для последующего выполнения, чтобы составить время.