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

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

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

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

Похожие темы

Была ли эта тема полезной?