Обработка конфликтов очереди таймера

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

Смотрите также

Похожие темы