阅读:6283回复:30
VC中如何实现微秒级延时?
比如需要等待15微秒后做一件事情,该怎么办?
|
|
|
沙发#
发布于:2004-10-15 15:08
首先要清楚一个概念:
Window95以后,微软采用的是抢占式多任务。这样的一个结果就是存在了系统调度问题。以Win2000为例,它的Chip(时间片)长度为1毫秒。所以,即使你写了一个for循环,在循环体中间就可能出现CPU被切换到别的任务上去了。这和协同多任务是大大不同的。 所以,在应用级别上去做15us,好像不太可能。系统随时有权中断掉你的代码。 你应该从更高的层次来解决问题:我认为,应用程序毫无必要来要求这么高的定时精度,很可能是你的系统架构有问题了。 能说一下你要15微妙的目的何在吗? |
|
|
板凳#
发布于:2004-10-15 10:27
好像sleep()只能精确到秒吧
|
|
地板#
发布于:2004-10-15 02:18
使用timegettime() API函数
|
|
|
地下室#
发布于:2004-09-20 10:03
sleep()的精度太低了吧
|
|
5楼#
发布于:2004-09-19 10:30
用Sleep(time)就可以了 当然不对, 你使用 dwTime = timeGetTime() ; Sleep(1) ; dwTime = timeGetTime()-dwTime ; // 结果不是1,通常是10或更大 |
|
|
6楼#
发布于:2004-09-19 08:40
开发驱动的环境下,利用硬件定时器进行中断可以达到很高的定时精度
|
|
7楼#
发布于:2004-09-18 20:36
用Sleep(time)就可以了
不知道对不 |
|
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 } |
|
9楼#
发布于:2004-08-15 11:30
用for循环,可以先用queryperformancecounter测试一下要循环多少次是你所需的时间,这也不是很准确的,不过波动不大
|
|
10楼#
发布于:2004-08-15 11:22
别费筋拉,精度这么高计算机根本就达不到,还是想别的辙吧
|
|
11楼#
发布于:2004-08-14 11:36
我没有MSDN
|
|
|
12楼#
发布于:2004-08-13 10:24
你明白KeQueryPerformanceCounter和KeQuerySystemTime这两个函数该怎么使用了吗?我看了msdn上的说明,但还是不太清楚该怎么用?请多多指教!
|
|
13楼#
发布于:2004-08-13 10:18
z_bing问题解决了吗?我也在用这个例子,但还不清楚该怎么样去精确控制延时时间,还有那几个变量和参数你赋了什么值呢? 没有解决。就这一个函数(QueryPerformanceFrequency)编译通过。其余的都没通过。 |
|
|
14楼#
发布于:2004-08-13 10:14
z_bing问题解决了吗?我也在用这个例子,但还不清楚该怎么样去精确控制延时时间,还有那几个变量和参数你赋了什么值呢?
能帮忙讲一下吗?谢谢! |
|
15楼#
发布于:2004-08-10 08:50
AP里可以用QueryPerformanceCounter 或者 timeGetSystemTime。 具体用法请查MSDN吧。 :) GOOD LUCK!
|
|
16楼#
发布于:2004-08-09 09:12
KeQuerySystemTime在ntddk.h中声明的有。 不过MSDN上说,只能达到10毫秒的精度。 也就是说我必须安装“DDK”? |
|
|
17楼#
发布于:2004-08-07 11:18
反复调用KeQueryPerformanceCounter系统资源耗的很多
|
|
18楼#
发布于:2004-08-06 17:58
AllenZh:用KeQueryPerformanceCounter循环怎么样? 据说它是取CPU内部的滴答计数器。可能循环的时候CPU接近于停顿 :D。 不过既然要求只延时15微秒,影响应该不会太大吧?
唉~~ 要是有个这样的中断就好了。 :o |
|
19楼#
发布于:2004-08-06 17:33
KeQuerySystemTime在ntddk.h中声明的有。 不过MSDN上说,只能达到10毫秒的精度。
|
|
上一页
下一页