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

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

楼主#
更多 发布于:2004-08-03 11:15
比如需要等待15微秒后做一件事情,该怎么办?
爱国守法,明理诚信,团结一致,战胜非典!
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-10-15 15:08
首先要清楚一个概念:
Window95以后,微软采用的是抢占式多任务。这样的一个结果就是存在了系统调度问题。以Win2000为例,它的Chip(时间片)长度为1毫秒。所以,即使你写了一个for循环,在循环体中间就可能出现CPU被切换到别的任务上去了。这和协同多任务是大大不同的。

所以,在应用级别上去做15us,好像不太可能。系统随时有权中断掉你的代码。
你应该从更高的层次来解决问题:我认为,应用程序毫无必要来要求这么高的定时精度,很可能是你的系统架构有问题了。

能说一下你要15微妙的目的何在吗?
A strong man can save himself. A great man can save another.
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-10-15 10:27
好像sleep()只能精确到秒吧
jingquanli
驱动牛犊
驱动牛犊
  • 注册日期2004-01-28
  • 最后登录2008-04-28
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-15 02:18
使用timegettime() API函数
jingquanli
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-20 10:03
sleep()的精度太低了吧
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-19 10:30
用Sleep(time)就可以了





不知道对不

当然不对,
你使用
dwTime = timeGetTime() ;
Sleep(1) ;
dwTime = timeGetTime()-dwTime ; // 结果不是1,通常是10或更大
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
lzy371
驱动牛犊
驱动牛犊
  • 注册日期2004-08-08
  • 最后登录2004-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-09-19 08:40
开发驱动的环境下,利用硬件定时器进行中断可以达到很高的定时精度
hhyjmd
驱动牛犊
驱动牛犊
  • 注册日期2004-06-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分104分
  • 威望11点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-09-18 20:36
用Sleep(time)就可以了





不知道对不
s_6666_s_qd
驱动巨牛
驱动巨牛
  • 注册日期2004-08-14
  • 最后登录2006-07-11
  • 粉丝0
  • 关注0
  • 积分199分
  • 威望22点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-09-15 13:47
用这个
static double
msecond()
{
#ifndef WIN32
struct timeval  tv;
gettimeofday(&tv, 0);
return (double)tv.tv_sec*1.0e3 + (double)tv.tv_usec*1.0e-3;
#else
clock_t clk;
clk = clock();
return clk * 1000 / CLOCKS_PER_SEC;
#endif
}
whitespray
驱动牛犊
驱动牛犊
  • 注册日期2004-04-23
  • 最后登录2006-10-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-08-15 11:30
用for循环,可以先用queryperformancecounter测试一下要循环多少次是你所需的时间,这也不是很准确的,不过波动不大
s_6666_s_qd
驱动巨牛
驱动巨牛
  • 注册日期2004-08-14
  • 最后登录2006-07-11
  • 粉丝0
  • 关注0
  • 积分199分
  • 威望22点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-08-15 11:22
别费筋拉,精度这么高计算机根本就达不到,还是想别的辙吧
z_bing
驱动中牛
驱动中牛
  • 注册日期2002-09-28
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-08-14 11:36
我没有MSDN
爱国守法,明理诚信,团结一致,战胜非典!
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-08-13 10:24
你明白KeQueryPerformanceCounter和KeQuerySystemTime这两个函数该怎么使用了吗?我看了msdn上的说明,但还是不太清楚该怎么用?请多多指教!
z_bing
驱动中牛
驱动中牛
  • 注册日期2002-09-28
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-08-13 10:18
z_bing问题解决了吗?我也在用这个例子,但还不清楚该怎么样去精确控制延时时间,还有那几个变量和参数你赋了什么值呢?
能帮忙讲一下吗?谢谢!


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


也就是说我必须安装“DDK”?
爱国守法,明理诚信,团结一致,战胜非典!
guard2002
驱动中牛
驱动中牛
  • 注册日期2002-05-21
  • 最后登录2017-03-07
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望65点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2004-08-07 11:18
反复调用KeQueryPerformanceCounter系统资源耗的很多
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2004-08-06 17:58
AllenZh:用KeQueryPerformanceCounter循环怎么样? 据说它是取CPU内部的滴答计数器。可能循环的时候CPU接近于停顿 :D。 不过既然要求只延时15微秒,影响应该不会太大吧?

唉~~ 要是有个这样的中断就好了。  :o
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2004-08-06 17:33
KeQuerySystemTime在ntddk.h中声明的有。 不过MSDN上说,只能达到10毫秒的精度。
上一页
游客

返回顶部