В напряженное время, в сценариях множества потоков выполнения, таймер, возможно, должен добавить функцию обратного вызова таймера (TimerFcn
) к очереди выполнения MATLAB®, прежде чем ранее выполнение с очередями функции обратного вызова завершилось. Можно определить, как объект - таймер обрабатывает этот сценарий путем установки свойства BusyMode
использовать один из этих режимов:
Если вы задаете 'drop'
как значение свойства BusyMode
, объект - таймер добавляет функцию обратного вызова таймера к очереди выполнения только, когда очередь пуста. Если очередь выполнения не пуста, объект - таймер пропускает выполнение обратного вызова.
Например, предположите, что вы создаете таймер с периодом 1 секунды, но обратный вызов, который требует по крайней мере 1,6 секунд, как показано здесь для mytimer.m
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
между выполнением обратного вызова таймерной функции, это сокращает период времени для последующего выполнения, чтобы составить время.