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

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

Закончите пятое выполнение обратного вызова.

Ошибочный режим

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

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

Похожие темы