MATLAB Answers

Pause function in matlab for 1 millisecond

2,486 ビュー (過去 30 日間)
Juan
Juan 2012 年 5 月 8 日
編集済み: Walter Roberson 2020 年 3 月 18 日
Hi,
I need to pause my matlab program at GUI, because I'm using serial communication, but when I use pause command it only allows me to pause it for 0.01 seconds.
pause(0.01) %in seconds
The thing I need, for example:
pause(0.001) %in seconds, but actually doesn't works
Anyone knows how to pause matlab for 1 millisecond? Thanks for read and answer.
Greetings.

  3 件のコメント

chandan kumar
chandan kumar 2017 年 1 月 17 日
Hello there,
First use:
pause on % to enable pause function
Now you can use pause function:
pause(x); // delay in seconds (x is non-negative real number)
Visit my blog: www.funwidelectronics.blogspot.in
Walter Roberson
Walter Roberson 2017 年 1 月 17 日
Pause is on by default.
On MS Windows, the resolution is only 0.01 seconds and using "pause on" does not change that.
Walter Roberson
Walter Roberson 2017 年 9 月 28 日
hafeez ahmad comments to chandan kumar :
it really helped me

サインイン to comment.

回答 (10 件)

Jan
Jan 2015 年 10 月 24 日
編集済み: Jan 2015 年 10 月 24 日
There is an accurate timer in Java, which can be called directly in Matlab:
java.lang.Thread.sleep(duration*1000) % in mysec!

  1 件のコメント

Hamid Reza saadati
Hamid Reza saadati 2016 年 3 月 8 日
thanks a lot

サインイン to comment.


AndreasDerFuchs
AndreasDerFuchs 2016 年 3 月 4 日
The attached pauses() matlab function combines the above ideas.
It can pause with an accuracy of 0.03 ms on my PC, without using too much CPU-bandwidth, as opposed to an accuracy of 0.8 ms with java.lang.Thread.sleep(ms), or the even worse accuracy of 15 ms with pause().
I've tested the accuracy with:
pauses(0); ii=1:300; d=ii/12345;
for i=ii;
t0=tic; pauses(d(i),t0); t(i)=toc(t0);
end;
fprintf('3 sigma accuracy = %.6f ms\n', std(t-d)*3000);

  2 件のコメント

akin hunerli
akin hunerli 2016 年 5 月 14 日
hi Hamid Reza saadati, i have the problem with the pause command working on a guide interface then i realised that we have to add a pause command end of the code.
Toby Dewhurst
Toby Dewhurst 2016 年 6 月 10 日
Works perfectly. Thanks for sharing!

サインイン to comment.


Daniel Shub
Daniel Shub 2012 年 5 月 8 日
Getting millisecond timing accuracy is extremely difficult in most programming languages since the underlying clocks are just not that accurate. It really is a question of how much jitter you can tolerate.
That said, the "serial port" tag makes me think you should look at callback functions.

  0 件のコメント

サインイン to comment.


Andreas Goser
Andreas Goser 2012 年 5 月 8 日
編集済み: John Kelly 2014 年 5 月 27 日
While Jakob's answer is a correct answer to your specific question, you might want to do something different, as the PAUSE command really stops MATLAB from doing stuff.

  0 件のコメント

サインイン to comment.


Malcolm Lidierth
Malcolm Lidierth 2016 年 5 月 19 日
編集済み: Malcolm Lidierth 2016 年 5 月 19 日
Pause does more than cause a sleep (see the docs) e.g. it flushes the AWT/Swing EDT. The minimum delay will therefore reflect what needs to be done in the background. undocumentedmatlab.com has several relevant posts (see drawnow/pause)

  0 件のコメント

サインイン to comment.


Jakob Sørensen
Jakob Sørensen 2012 年 5 月 8 日
Doesn't work how? And what Matlab version are you using? In R2011b, running Windows 7, I get the following results
>> tic;pause(0.001);toc;
Elapsed time is 0.009849 seconds.
Which is reasonably close to 1 ms.

  7 件のコメント

表示 4 件の古いコメント
Christin
Christin 2012 年 6 月 4 日
Juan I am experiencing the exact same problem! I've found that ~0.0156 sec is the fastest "pause" can go. I'd love to do a for-loop at 100Hz but can't another way to do it. If you ever find a solution to this problem please share!
timo
timo 2015 年 11 月 2 日
Elapsed time is 0.015487 seconds. Wtf
Walter Roberson
Walter Roberson 2015 年 11 月 2 日
R2015a on OS-X:
g = @() pause(0.001);
timeit(g, 0)
shows outputs between 0.001255 and 0.001404. (Be sure to use 0 as the second argument or else you end up measuring the time to return the "state" of the timer.)
The result is consistently higher than 1 1/4 millisecond and less than 1 1/2 millisecond in the tests I have done this way. Note that
tic(); pause(0.001); toc()
at the command line is not completely representative due to differences in what is JIT (Just In Time compiled)

サインイン to comment.


Marcel Kraemer
Marcel Kraemer 2013 年 2 月 5 日
編集済み: Marcel Kraemer 2013 年 2 月 5 日
Hi Guys,
I had the same problem as you and I couldn't find an answer on the internet. So I tried following solution which works percetly well for me.
function delay(seconds)
% function pause the program
% seconds = delay time in seconds
tic;
while toc < seconds
end
end
Cheers, Marcel

  1 件のコメント

KnowledgeSeeker
KnowledgeSeeker 2014 年 6 月 20 日
Thank you Marcel. Works for me too...

サインイン to comment.


Andreas Sprenger
Andreas Sprenger 2013 年 9 月 27 日
Hi,
on a 32bit Windows System you may use a kernel function. It works quite accurate, I've tested it against hardware timer. Unfortunately I haven't found a solution on 64bit Win7. Any hints are welcome.
Cheers
Andreas
Here an example for 32bit Windows:
if ~libisloaded('QPerf')
% loads kernel functions for time measurement
loadlibrary ('kernel32.dll', @QueryPerformance, 'alias', 'QPerf')
end
% data structure for QueryPerformance...
Value.LowPart = uint32(0);
Value.HighPart = uint32(0);
QStruct = libstruct('s_ULARGE_INTEGER', Value);
% Get performance of the computer
[xval, QFreq] = calllib('QPerf', 'QueryPerformanceFrequency', QStruct);
Frequency = QFreq.HighPart*2^32 + QFreq.LowPart;
% Get t0
[~, QCounter] = calllib('QPerf', 'QueryPerformanceCounter', QStruct);
t0 = (QCounter.HighPart*2^32 + QCounter.LowPart) / Frequency * 1000;
t1 = t0;
% example: wait a second
while t1 - t0 < 1000
[~, QCounter] = calllib('QPerf', 'QueryPerformanceCounter', QStruct);
t1 = (QCounter.HighPart*2^32 + QCounter.LowPart) / Frequency * 1000;
end
% -----
function [methodinfo,structs,enuminfo] = QueryPerformance
%This function was generated by the perl file prototypes.pl called from loadlibary.m on Wed Apr 5 19:40:14 2006
%perl options:'win.i -outfile=QueryPerformance
ival={cell(1,0)}; % change 0 to the actual number of functions to preallocate the data.
fcns=struct('name',ival,'calltype',ival,'LHS',ival,'RHS',ival,'alias',ival);
structs=[];enuminfo=[];fcnNum=1;
% BOOL _stdcall QueryPerformanceCounter(LARGE_INTEGER *);
fcns.name{fcnNum}='QueryPerformanceCounter';
fcns.calltype{fcnNum}='stdcall';
fcns.LHS{fcnNum}='int32';
fcns.RHS{fcnNum}={'s_ULARGE_INTEGERPtr'};
fcnNum = fcnNum+1;
% BOOL _stdcall QueryPerformanceFrequency(LARGE_INTEGER *);
fcns.name{fcnNum}='QueryPerformanceFrequency';
fcns.calltype{fcnNum}='stdcall';
fcns.LHS{fcnNum}='int32';
fcns.RHS{fcnNum}={'s_ULARGE_INTEGERPtr'};
fcnNum = fcnNum+1;
structs.s_ULARGE_INTEGER.packing=8;
structs.s_ULARGE_INTEGER.members=struct('LowPart', 'uint32', 'HighPart', 'uint32');
methodinfo = fcns;

  0 件のコメント

サインイン to comment.


Richard Plant
Richard Plant 2012 年 5 月 13 日
I guess it depends on what you want to do but there's a subtle difference between accuracy and precision. Even using APIs you'll be millisecond precise but not accurate. That is, units of milliseconds but not that you're reading the timer at the right time.
Plus if you're trying to time say a visual display to the millisecond then you're likely to be out of luck. PC's, Macs and Linux will all have similar problems as they use the same hardware. Even RTOS systems won't help you all that much as soon as you interact with a standard TFT or keyboard.
For some background on the issues take a look at: http://www.blackboxtoolkit.com and read about our Black Box ToolKit which helps users achieve millisecond timing accuracy in experimental work.

  1 件のコメント

Daniel Shub
Daniel Shub 2012 年 5 月 14 日
As is, I would say that this answer seems a lot like spam and falls into the editor guidelines ( http://www.mathworks.co.uk/matlabcentral/about/answers/editing/ ) for deletion because of "Off-topic content not related to MATLAB or any MathWorks products". This answer would be a lot better if you provided some MATLAB code that "pauses for 1 ms" and then then showed measurements from you blackbox that the pause was not 1 ms. Ideally, give the tags chosen by the OP, the MATLAB code should do something with the serial port (from my quick glance at the documentation of blackbox it is not clear that blackbox can measure and create serial port "events").

サインイン to comment.


Andreas Sprenger
Andreas Sprenger 2013 年 9 月 27 日
Hi,
searching for a solution on 64bit Matlab I came across a workaround. Edit the prototype and change fcns.calltype from 'stdcall' (most common on 32bit Windows systems) to 'cdecl' (C type declaration). It works both on 32bit and 64bit Matlab systems. On 2013a there is a warning that the loader file will not be supported in future.
Andreas

  1 件のコメント

Jan
Jan 2015 年 10 月 24 日
Please do not post a question in the section for answers. See my new answer...

サインイン to comment.

サインイン してこの質問に回答します。


Translated by