在windows下实现纳秒级延时~~~

lixiaosan 2005-08-30 11:08:42
如何在windows下实现纳秒级(ns)的延时~~
...全文
1306 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
loutingyv 2005-09-02
  • 打赏
  • 举报
回复
学西
sycnick 2005-09-02
  • 打赏
  • 举报
回复
真想不明白

windows下怎么会做ns级的应用呢?
loseme915 2005-09-02
  • 打赏
  • 举报
回复
前一段时间我写过这样的东西,取CPU的运行时间,然后比较。但是在1.5G的CPU上只能精确到3NS左右。
rshu 2005-09-02
  • 打赏
  • 举报
回复
windows只能产生55ms以上精度的时钟,好像侯sir的书上有,要小于这个时间,自己写中断处理程序。
WYJBCB 2005-08-31
  • 打赏
  • 举报
回复
皮皮鲁 2005-08-31
  • 打赏
  • 举报
回复
学习
ruodeer 2005-08-31
  • 打赏
  • 举报
回复
mark
legendhui 2005-08-31
  • 打赏
  • 举报
回复

2.系统计时器.

在Windows的SYSTEM.DRV驱动程序中提供了几个鲜为人知的系统计时器函数(这几个函

数未写入Windows.h中,但却被SYSTEM.DRV输出了),这几个函数可以帮助我们获得精

确计时器服务,即系统计时器。这其中最重要的是CreateSystemTimer()和

KillSystemTimer(),这两个函数允许我们安装异步计时器的回调函数(Callback),有

些类似于在DOS环境中截取INT 8中断处理程序。这个回调是真正异步的,完全避开了

Windows的消息工具,因而具有重要意义。事实上,Microsoft Excel和Windows COMM

驱动程序都用到了系统计时器,而由SetTimer()安装的一般计时器也是由系统计时器

来实现的。

这两个函数的原型如下:

WORD CreateSystemTimer(wMsecInterval,lpfnTimerProc);

WORD wMsecInterval; /*以毫秒为单位的时间间隔,系统将每隔此时间调用一 次回调函数

*/

FARPROC lpfn TimerProc;/*指向回调函数的指针*/

WORD KillSystemTimer(hTimer);

WORD hTimer;/*欲释放的系统计时器句柄*/

 

其中,CreateSystemTimer()用于安装一个系统计时器回调函数,SYSTEM INT8处理程序将

按wMsecInterval指定的时时间间隔调用此回调函数。当然,这个指定的回调频率也是有

限的,同SetTimer()一样,每秒钟调用回调函数次数不能超过18.2次,即wMsecInterval>

55。该函数返回一个系统计时器句柄。若安装失败,则返回NULL。KillSystemTimer()则

用于撤销一个已安装的系统计时器hTimer。若成功,则返回;出错则返回传给它的参数

hTimer。

 

3.使用系统计时器应注意的问题。

系统计时器回调函数虽然不是中断处理程序,但由于它直接被中断处理程序调用,因此也

必将它看作中断代码。这也就决定了在使用过程中必须注意以下几个问题:

(1).在回函数中应包括尽量少的代码,以使得频繁回调的该函数不至于占用太多的CPU时

间。一般情况下,系统计时器总是用来监视或设置某些变量的值。

(2).由于该回调函数属于中断代码,因此大多数Windows API函数调用都不适用了,只有

几个简单的函数仍然可以使用,如PostMessage(),GetCurrentTask()和MessageBeep()

等。

(3).由于该回调函数由中断处理程序直接调用,因此该函数必须放在一个固定的代码段

中,并且调用前必须装载DS寄存器,这可由形实替换函数MakeProcInstance()来做到。

另外,由于这两个函数在Windows.h中没有给出(即Windows缺省输入库不含此两函数),因

此在调用之前必须进行链接。这可采用运行时动态链接,即通过GetModuleHandle()和

GetProcAddress()来链接;也可在程序模块定义文件中用IMPORTS语句来引入,此时则必

须在程序源文件中说明CreateSystemTimer()和KillSystemTimer()为外部函数。本文给出

的例子采用第二种方案。

legendhui 2005-08-31
  • 打赏
  • 举报
回复
收集的:
1. CreateWaitableTimer,SetWaitableTimer,优点是精确度为100n秒,计时满后调用指定的回调函

数,所以系统占用率非常低,缺点是能够记得最短时间是10毫秒,
2 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就是所用的时间
缺点是:因为是要循环查询方式,所已精确定时时,资源占用达到100%,系统停顿,
3 多媒体计时器
timesetevent
缺点是精确度不高,只有1毫秒,能够记得最短时间也不高,为1毫秒,

4操作8253,缺点是到读写端口,非常麻烦,好像也是循环查询方式,
legendhui 2005-08-31
  • 打赏
  • 举报
回复
在WINDOWS下不可能做出来与机器无关的精确的计时程序。如果用系统提供的计时器(其实是硬件提供--8253计时器),最多只能精确到200毫秒以上(200并不准确)。WINDOWS本身并不能产生即使信号。8253的计时信号适于定义好的,计时器0的频率月为18。2MHz.
thisisll 2005-08-31
  • 打赏
  • 举报
回复
路过学习
lixiaosan 2005-08-31
  • 打赏
  • 举报
回复
呵呵。。。多谢xd们拉。。。继续继续
heidongstar 2005-08-31
  • 打赏
  • 举报
回复
windowns不可能实现纳秒级的延时,换os吧
pomelowu 2005-08-31
  • 打赏
  • 举报
回复
我是黔驴技穷了,帮你up吧
lixiaosan 2005-08-31
  • 打赏
  • 举报
回复
继续
hdqqq 2005-08-30
  • 打赏
  • 举报
回复
以前的水行鸟 老大的回复.
在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中。由于EDX:EAX寄存器对恰好是Win32平台下C++语言保存函数返回值的寄存器,所以我们可以把这条指令看成是一个普通的函数调用。像这样:

inline unsigned __int64 GetCycleCount()
{
__asm RDTSC
}

但是不行,因为RDTSC不被C++的内嵌汇编器直接支持,所以我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31,如下:

inline unsigned __int64 GetCycleCount()
{
__asm _emit 0x0F
__asm _emit 0x31
}

以后在需要计数器的场合,可以像使用普通的Win32 API一样,调用两次GetCycleCount函数,比较两个返回值的差,像这样:

unsigned long t;
t = (unsigned long)GetCycleCount();
//Do Something time-intensive ...
t -= (unsigned long)GetCycleCount();
这个方法的优点是高精度。可以直接达到纳秒级的计时精度(在1GHz的CPU上每个时钟周期就是一纳秒)缺点就是在使用前必须了解cpu的频率的准确值

dirdirdir3 2005-08-30
  • 打赏
  • 举报
回复
1G的cpu的一个时钟周期好像就是1ns吧,执行个加法都要几个周期了,只能大概吧。
xx_jj 2005-08-30
  • 打赏
  • 举报
回复
用select函数 你去查msdn
yayafu 2005-08-30
  • 打赏
  • 举报
回复
不可能,调用一个API都要1微秒以上的时间,我的机器是p4 1.5GHz,256M内存的,怎么达到ns啊,你们可以自己测一下
gohappy_1999 2005-08-30
  • 打赏
  • 举报
回复
mark
加载更多回复(21)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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