Main Content

Handling Timer Queuing Conflicts

At busy times, in multiple-execution scenarios, the timer may need to add the timer callback function (TimerFcn) to the MATLAB® execution queue before the previously queued execution of the callback function has completed. You can determine how the timer object handles this scenario by setting the BusyMode property to use one of these modes:

Drop Mode (Default)

If you specify 'drop' as the value of the BusyMode property, the timer object adds the timer callback function to the execution queue only when the queue is empty. If the execution queue is not empty, the timer object skips the execution of the callback.

For example, suppose you create a timer with a period of 1 second, but a callback that requires at least 1.6 seconds, as shown here for 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

This table describes how the timer manages the execution queue.

Approximate Elapsed Time (Seconds)

Action

0

Start the first execution of the callback.

1

Attempt to start the second execution of the callback. The first execution is not complete, but the execution queue is empty. The timer adds the callback to the queue.

1.6

Finish the first callback execution, and start the second. This action clears the execution queue.

2

Attempt to start the third callback execution. The second execution is not complete, but the queue is empty. The timer adds the callback to the queue.

3

Attempt to start the fourth callback execution. The third callback is in the execution queue, so the timer drops this execution of the function.

3.2

Finish the second callback and start the third, clearing the execution queue.

4

Attempt to start another callback execution. Because the queue is empty, the timer adds the callback to the queue. This is the fifth attempt, but only the fourth instance that will run.

4.8

Finish the third execution and start the fourth instance, clearing the queue.

5

Attempt to start another callback. An instance is running, but the execution queue is empty, so the timer adds it to the queue. This is the fifth instance that will run.

6

Do nothing: the value of the TasksToExecute property is 5, and the fifth instance to run is in the queue.

6.4

Finish the fourth callback execution and start the fifth.

8

Finish the fifth callback execution.

Error Mode

The 'error' mode for the BusyMode property is similar to the 'drop' mode: In both modes, the timer allows only one instance of the callback in the execution queue. However, in 'error' mode, when the queue is nonempty, the timer calls the function that you specify using the ErrorFcn property, and then stops processing. The currently running callback function completes, but the callback in the queue does not execute.

For example, modify mytimer.m (described in the previous section) so that it includes an error handling function and sets BusyMode to '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

This table describes how the timer manages the execution queue.

Approximate Elapsed Time (Seconds)

Action

0

Start the first execution of the callback.

1

Attempt to start the second execution of the callback. The first execution is not complete, but the execution queue is empty. The timer adds the callback to the queue.

1.6

Finish the first callback execution, and start the second. This action clears the execution queue.

2

Attempt to start the third callback execution. The second execution is not complete, but the queue is empty. The timer adds the callback to the queue.

3

Attempt to start the fourth callback execution. The third callback is in the execution queue. The timer does not execute the third callback, but instead calls the error handling function.

3.2

Finish the second callback and start the error handling function.

Queue Mode

If you specify 'queue', the timer object waits until the currently executing callback function finishes before queuing the next execution of the timer callback function.

In 'queue' mode, the timer object tries to make the average time between executions equal the amount of time specified in the Period property. If the timer object has to wait longer than the time specified in the Period property between executions of the timer function callback, it shortens the time period for subsequent executions to make up the time.

See Also

Related Topics