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

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

Ничего не делайте: значение TasksToExecute свойство 5, и пятый образец, который будет запущен, находится в очереди.

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

См. также

Похожие темы