如何对时间再精确到 毫秒 (0.01ms) 以后? 欢迎UP、GZ

vcfor 2002-07-02 07:30:06
如何对时间再精确到 毫秒 (0.01ms) 以后?
...全文
218 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcfor 2002-07-07
  • 打赏
  • 举报
回复
好了, 收获不少, 可以结贴了。 答谢各位兄弟了。
vcfor 2002-07-07
  • 打赏
  • 举报
回复
不好意思, 过了两天没来。
zdhe 2002-07-05
  • 打赏
  • 举报
回复
if does not use HW and ISR to deal with it, you will never get any real time interrupt which less than 20ms.

because OS task schedule use 10-50 ms as task switch ....
司马青衫依旧 2002-07-05
  • 打赏
  • 举报
回复
欧,我错了。10毫秒!!!!!!!!真笨
司马青衫依旧 2002-07-05
  • 打赏
  • 举报
回复
kensta() :不是吗???????????
m就是千分之一的意思呀!mm是毫米,mg是毫克。
ciacia 2002-07-04
  • 打赏
  • 举报
回复
up !!
shuohua 2002-07-04
  • 打赏
  • 举报
回复
哦,虽然不能帮你,但是帮你UP一下!希望你能得到好的解答!
UP! :)
kensta 2002-07-04
  • 打赏
  • 举报
回复
to greenever(司马青杉): 0.01s=1ms?
nbgyf 2002-07-03
  • 打赏
  • 举报
回复
知道晶振吗
__asm{
nop;
}
司马青衫依旧 2002-07-03
  • 打赏
  • 举报
回复
首先我想问:哥哥,你到底是想要精确到毫秒还是0.01毫秒?????你怎么写的是矛盾的:“精确到 毫秒 (0.01ms) ”----这对吗?
应该是0.01s=1ms!

接着:当误差不大于1ms的时候,可以利用GetTickCount()函数。该函数返回值是DWORD类型的,表示以毫秒为单位的计算机启动后经历的时间间隔。

如果还不行,应该使用QueryPerformanceFrequency()和QueryPerformanceCount()这两个函数。

如果还不行,使用多媒体定时器。

具体参看:http://www.5xsoft.com/data/200112/2908075501.htm

如果还不行,(你就算了吧)
司马青衫依旧 2002-07-03
  • 打赏
  • 举报
回复
首先我想问:哥哥,你到底是想要精确到毫秒还是0.01毫秒?????你怎么写的是矛盾的:“精确到 毫秒 (0.01ms) ”----这对吗?
应该是0.01s=1ms!

接着:当误差不大于1ms的时候,可以利用GetTickCount()函数。该函数返回值是DWORD类型的,表示以毫秒为单位的计算机启动后经历的时间间隔。

如果还不行,应该使用QueryPerformanceFrequency()和QueryPerformanceCount()这两个函数。

如果还不行,使用多媒体定时器。

具体参看:http://www.5xsoft.com/data/200112/2908075501.htm

如果还不行,(你就算了吧)
nbgyf 2002-07-03
  • 打赏
  • 举报
回复
otuotu(呕吐呕吐) 的方法不知是否可行,我没试过?
但是,使用GetTickCount()函数的计时,在结合晶振即可,
本人刚实现了一个,8*(10-6e)秒
puppet 2002-07-03
  • 打赏
  • 举报
回复
三种Windows中的定时或计时方法
大连理工大学 孙鹤泉

--------------------------------------------------------------------------------

---- 随着软硬件的飞速发展,计算机技术已经广泛地应用到自动化控制领域,为了实现实时控制,控制程序应该能够精确地完成定时和计时。Visual C++提供了很多关于时间操作的函数,下面根据它们精度的不同,分别进行说明。

---- 任何Visual C++的程序员都会利用Windows的WM_TIMER消息映射来进行简单的时间控制:1、调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200毫秒的时间间隔;2、在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成定时时间到时的操作。这种定时方法是非常简单的,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况,但在精度要求较高的条件下,这种方法应避免采用。

---- 在要求误差不大于1毫秒的情况下,可以采用GetTickCount()函数(如果读者仍然使用Windows3.1,可以使用GetCurrentTime()函数),该函数的返回值是DWORD型,表示以毫秒为单位的计算机启动后经历的时间间隔。使用下面的编程语句,可以实现50毫秒的精确定时,其误差小于1毫秒。以下语句已经使用在大连理工大学海岸和近海工程国家重点实验室为广东省水利水电科学研究所研制开发的液压伺服多向不规则造波机系统的控制程序中。

DWORD dwStart, dwStop ; // 起始值和中止值
dwStop = GetTickCount();
while(TRUE)
{
dwStart = dwStop ; // 上一次的中止值变成新的起始值
// …… 此处添加相应控制语句 ……
do
{
dwStop = GetTickCount() ;
} while(dwStop - 50 < dwStart) ;
}

---- 对于一般的实时控制,使用GetTickCount()函数就可以满足精度要求。但作者在为大连基康公司编写快速计数程序时,发现使用GetTickCount()函数对计数结果产生很大影响。为了进一步提高计时精度,作者使用了QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数。这两个函数是Visual C++提供的仅供Windows 95及其后续版本使用的高精度时间函数,并要求计算机从硬件上支持高精度计时器。QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型为:
BOOL QueryPerformanceFrequency
(LARGE_INTEGER *lpFrequency) ;
BOOL QueryPerformanceCounter
(LARGE_INTEGER *lpCount) ;

---- 数据类型LARGE_INTEGER既可以是一个作为8字节长的整型数,也可以作为两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:
typedef union _LARGE_INTEGER
{
struct
{
DWORD LowPart ; // 4字节整型数
LONG HighPart ; // 4字节整型数
};
LONGLONG QuadPart ; // 8字节整型数
} LARGE_INTEGER ;

---- 在进行计时之前,应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。作者在主频为266、300、333的三种PentiumⅡ机器上使用该函数,得到的时钟频率都是1193180Hz。接着,作者在需要严格计时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。下面的程序是用来测试函数Sleep(100)的精确持续时间。
LARGE_INTEGER litmp ;
LONGLONG QPart1,QPart2 ;
double dfMinus, dfFreq, dfTim ;

QueryPerformanceFrequency(&litmp) ;
// 获得计数器的时钟频率
dfFreq = (double)litmp.QuadPart ;

QueryPerformanceCounter(&litmp) ;
// 获得初始值
QPart1 = litmp.QuadPart ;

Sleep(100) ;

QueryPerformanceCounter(&litmp) ;
// 获得中止值
QPart2 = litmp.QuadPart ;

dfMinus = (double)(QPart2 - QPart1) ;
dfTim = dfMinus / dfFreq ;
// 获得对应的时间值

---- 执行上面程序,得到的结果为dfTim=0.097143767076216(秒),细心的读者会发现,每次执行的结果都不一样,存在一定的差别,这是由于Sleep()自身的误差所致。
---- 本文介绍了三种定时或计时的实现方法,读者可以根据自己的实际情况进行选择,以达到程序的定时和计时功能。以上程序均使用Visual C++5.0和6.0在Windows98下调试通过。


puppet 2002-07-03
  • 打赏
  • 举报
回复
我有一个精确控制时间的例子
email:zhangwj@ciac.jl.cn
风扬絮 2002-07-03
  • 打赏
  • 举报
回复
windows的响应时间会将定时器有这样的精度变得毫无价值
YP2002CN 2002-07-03
  • 打赏
  • 举报
回复
0.01毫秒是難以捕捉的..赫赫...你厲害.你想這麼精確幹嘛?想獲的諾貝爾物理學獎??
LuoQS1 2002-07-03
  • 打赏
  • 举报
回复
GetSystemTime
otuotu 2002-07-03
  • 打赏
  • 举报
回复
足够精确的,不懂的地方再看看MSDN好了
otuotu 2002-07-03
  • 打赏
  • 举报
回复
LARGE_INTEGER lCnt1,lFr,lCnt2;
double f1,f2,fTime;
QueryPerformanceCounter(&lCnt1);
......
QueryPerformanceCounter(&lCnt2);
QueryPerformanceFrequency(&lFr);//得到计数器的频率
f1=lCnt2.QuadPart-lCnt1.QuadPart;
f2=lFr.QuadPart;
fTime=(double)(f1/f2); //fTime就是所用的时间
harry202 2002-07-02
  • 打赏
  • 举报
回复
定时器有可能准,但是系统不能保证准时相应,因为window不是实时操作系统,而是抢占式的,那么高的精确度相应,只有换系统或者用硬件了
加载更多回复(5)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧