exponenta event banner

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

Во время занятости в сценариях множественного выполнения таймеру может потребоваться добавить функцию обратного вызова таймера (TimerFcn) в очередь выполнения MATLAB ® до завершения ранее поставленного в очередь выполнения функции обратного вызова. Можно определить, как объект таймера обрабатывает этот сценарий, установив значениеBusyMode для использования одного из следующих режимов:

Режим перетаскивания (по умолчанию)

При указании 'drop' как значение BusyMode свойство, объект timer добавляет функцию обратного вызова таймера в очередь выполнения, только когда очередь пуста. Если очередь выполнения не пуста, объект таймера пропускает выполнение обратного вызова.

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

См. также

Связанные темы