timer or while-loop is the question
23 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
It is possible to emulate a simple timer with a while-loop as I outline below.
The timer object causes me trouble and now I think a construct based on a while-loop would serve better in my specific case. I need a timer that runs "forever" and invokes a "callback function" every few seconds. It should be able to recover after run-time errors in the "callback function".
Reasons to use a while-loop:
- easy to debug; no spurious callbacks
- better error messages; no lost function names and line numbers
- straight forward to catch run-time errors at the top-level with try-catch-end
Reasons to use the timer:
- "The advantage of the timer is it allows you to do something else while the timer is waiting giving you the appearance of multi-threading." copied from Daniels answer.
- better control over when callbacks are fired (see Daniels answer)
- less and more readable code
Have I missed something important?
.
Out-line of simple "timer" based on a while-loop
period = 1;
tasks2execute = 1;
TasksToExecute = 3;
start_delay = 0;
pause( start_delay )
while tasks2execute <= TasksToExecute
try
timer_function( ... )
catch me
disp( 'cleanup' )
end
pause( period )
tasks2execute = tasks2execute + 1;
end
.
and my timer construct; "my specific case" (added 2013-02-09)
tmr = timer('Name' , 'my_timer' ...
, 'TimerFcn' , @timer_function ...
, 'BusyMode' , 'drop' ...
, 'ExecutionMode' , 'fixedDelay' ...
, 'Period' , 1 ...
, 'StartDelay' , 1 ...
, 'TasksToExecute', 999999 ...
);
start( tmr )
wait ( tmr )
0 comentarios
Respuesta aceptada
Daniel Shub
el 9 de Mzo. de 2013
Editada: Daniel Shub
el 9 de Mzo. de 2013
I think your reasons to use a timer are wrong. Since timers are running in an alternate thread they don't always fire when they should. A loop can only be interrupted when you say it can. This means you can block out interrupts 100ms before the callback and be pretty much guaranteed the callback fires when it should. As for less code you could write a timerloop function so you would only have 1 line of code.
The advantage of the timer is it allows you to do something else while the timer is waiting giving you the appearance of multi threading. Imagine a GUI stop watch that updated every second. From the commandline you might type start(stopwatch). If you used a timer it would return instantly. With a timer loop it would never return.
I personally find Timer object useless for anything requiring better than 10s accuracy.
5 comentarios
Daniel Shub
el 10 de Mzo. de 2013
Per, some discussion about when timers can fire, and links to documentation can be found in this old question (although the documentation appears to be wrong). I will follow this up with a new question.
Más respuestas (0)
Ver también
Categorías
Más información sobre Language Fundamentals en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!