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