z_bing
驱动中牛
驱动中牛
  • 注册日期2002-09-28
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5973回复:30

VC中如何实现微秒级延时?

楼主#
更多 发布于:2004-08-03 11:15
比如需要等待15微秒后做一件事情,该怎么办?
爱国守法,明理诚信,团结一致,战胜非典!
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-08-03 13:11
这可能吗? 关注!
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-03 13:26
应用程做不到微秒级,最少能到1ms,而且不太准,我试过
zfw
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2004-08-03 17:02
应用程做不到微秒级,最少能到1ms,而且不太准,我试过


驱动就可以做到吗?
lxh_phr
驱动小牛
驱动小牛
  • 注册日期2001-05-14
  • 最后登录2023-10-18
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望156点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2004-08-03 19:01
驱动可能做到,驱动定时的分辨率为100ns
lxh_zz
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2004-08-04 09:54
驱动可能做到,驱动定时的分辨率为100ns


怎么做? 说一下思路 :)
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-04 11:37
The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists.

BOOL QueryPerformanceFrequency(
  LARGE_INTEGER *lpFrequency   // address of current frequency
);
 
Parameters
lpFrequency
Pointer to a variable that the function sets, in counts per second, to the current performance-counter frequency. If the installed hardware does not support a high-resolution performance counter, this parameter can be to zero.
Return Values
If the installed hardware supports a high-resolution performance counter, the return value is nonzero.

If the installed hardware does not support a high-resolution performance counter, the return value is zero

不用驱动也可以做到
取得的记时单位是最小的时钟周期
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-04 11:38
这是PC系统最精确的时间单位了
不可能有更小的时间粒度
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
village
驱动牛犊
驱动牛犊
  • 注册日期2003-11-18
  • 最后登录2004-08-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-04 13:47
 :)
不错,顶
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2004-08-04 14:14
这样得到的是系统可以分辨的最小时间间隔。但要做成定时器,那是另一回事。

即使你循环的调用QueryPerformanceCounter来取时间,也要考虑函数的执行周期。如果在AP里,还有考虑线程的调度时间。

个人认为在AP里是不大可能的。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-08-06 12:47
比如需要等待15微秒后做一件事情,该怎么办?

等待的这段时间需要调度去做别的任务吗?
如果需要应该不太现实。
如果不需要,可上使用

void Delay(ULONG xMs)
{
LARGE_INTEGER llStart ;
LARGE_INTEGER llEnd ;
LARGE_INTEGER llFreq ;

KeQueryPerformanceCounter(&llFreq ) ;
llFreq.QuadPart = llFreq.QuadPart*xMs/1000 ;
KeQuerySystemTime(&llStart) ;
do
KeQuerySystemTime(&llEnd) ;
while((llEnd.QuadPart-llStart.QuadPart)<llFreq.QuadPart) ;
}


________________________________________________________

回答的好请给分
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
z_bing
驱动中牛
驱动中牛
  • 注册日期2002-09-28
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-08-06 15:12

等待的这段时间需要调度去做别的任务吗?
如果需要应该不太现实。
如果不需要,可上使用

void Delay(ULONG xMs)
{
LARGE_INTEGER llStart ;
LARGE_INTEGER llEnd ;
LARGE_INTEGER llFreq ;

KeQueryPerformanceCounter(&llFreq ) ;
llFreq.QuadPart = llFreq.QuadPart*xMs/1000 ;
KeQuerySystemTime(&llStart) ;
do
KeQuerySystemTime(&llEnd) ;
while((llEnd.QuadPart-llStart.QuadPart)<llFreq.QuadPart) ;
}

不调度别的任务,这样就可以了。非常感谢您提供的例子!

不过编译不过去。系统提示:

'QuerySystemTime' : undeclared identifier

不知这个系统函数究竟该怎样写?
爱国守法,明理诚信,团结一致,战胜非典!
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2004-08-06 17:33
KeQuerySystemTime在ntddk.h中声明的有。 不过MSDN上说,只能达到10毫秒的精度。
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2004-08-06 17:58
AllenZh:用KeQueryPerformanceCounter循环怎么样? 据说它是取CPU内部的滴答计数器。可能循环的时候CPU接近于停顿 :D。 不过既然要求只延时15微秒,影响应该不会太大吧?

唉~~ 要是有个这样的中断就好了。  :o
guard2002
驱动中牛
驱动中牛
  • 注册日期2002-05-21
  • 最后登录2017-03-07
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望65点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2004-08-07 11:18
反复调用KeQueryPerformanceCounter系统资源耗的很多
z_bing
驱动中牛
驱动中牛
  • 注册日期2002-09-28
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-08-09 09:12
KeQuerySystemTime在ntddk.h中声明的有。 不过MSDN上说,只能达到10毫秒的精度。


也就是说我必须安装“DDK”?
爱国守法,明理诚信,团结一致,战胜非典!
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2004-08-10 08:50
AP里可以用QueryPerformanceCounter 或者 timeGetSystemTime。 具体用法请查MSDN吧。 :) GOOD LUCK!
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-08-13 10:14
z_bing问题解决了吗?我也在用这个例子,但还不清楚该怎么样去精确控制延时时间,还有那几个变量和参数你赋了什么值呢?
能帮忙讲一下吗?谢谢!
z_bing
驱动中牛
驱动中牛
  • 注册日期2002-09-28
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-08-13 10:18
z_bing问题解决了吗?我也在用这个例子,但还不清楚该怎么样去精确控制延时时间,还有那几个变量和参数你赋了什么值呢?
能帮忙讲一下吗?谢谢!


没有解决。就这一个函数(QueryPerformanceFrequency)编译通过。其余的都没通过。
爱国守法,明理诚信,团结一致,战胜非典!
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-08-13 10:24
你明白KeQueryPerformanceCounter和KeQuerySystemTime这两个函数该怎么使用了吗?我看了msdn上的说明,但还是不太清楚该怎么用?请多多指教!
上一页
游客

返回顶部