I am trying to print a warning or just a message after every second, like \"1 second elapsed\". Is there a possibility to realize that?
I tried it with tic toc and a loo
Use a timer object.
t = timer;
t.ExecutionMode = 'fixedRate';
t.Period = 1;
t.TimerFcn = @(~,~)disp('1s elapsed');
start(t)
As @Daniel suggested, timer objects are the way to go.
One thing to remember is that MATLAB timers execute asynchronously but are not truly parallel (even though timer objects run in a different thread, the MATLAB interpreter is still single-threaded).
So timer events might not fire (BusyMode
property defaults to drop
) it they occur during certain lengthy non-interruptible operations (like builtin functions, MEX-functions, etc..).
Here is an example:
>> t = timer('ExecutionMode','fixedRate', 'Period',1, 'BusyMode','drop', ...
'TimerFcn',@(~,~)disp(datestr(now,'MM:SS')));
>> start(t)
35:21
35:22
35:23
>> eig(rand(2000)); % <-- takes a couple of seconds to finish
35:27
35:28
35:29
35:30
>> stop(t)
Note how the timer event did not get a chance to execute while the EIG
function was running.
Now if we change the BusyMode property to queue
, then once again the event will not fire during the execution of EIG
operation, but will immediately spit out all the queued events once EIG
finishes:
>> t.BusyMode = 'queue';
>> start(t)
37:39
37:40
>> eig(rand(2000));
37:45
37:45
37:45
37:45
37:45
37:46
37:47
>> stop(t)
>> delete(t)
It is called pause
. The optional argument specifies the duration in seconds. Documentation: http://www.mathworks.de/de/help/matlab/ref/pause.html