文档介绍:关于各种延时在 Linux 中,如果是应用层下的一些应用,我们可以: 1)调用 unsigned int sleep(unsigned int second); 函数去定时,这个时候它是秒级的; 头文件为<> ; 2)调用 int usleep(useconds_t); 函数去定时,这个时候它是微秒级的;头文件为<> ; 3)调用高精度睡眠 int nanosleep(const struct timespec * rep, struct timespec *rem); 是一个相比标准 UNIX 的 sleep 调用具有更高高精度的版本。和普通的 sleep 调用计算整秒数不同, nanosleep 接受一个指向一个 struct timespec 对象的指针作为参数,它可以表示毫微秒( nanosecond ,十亿分之一秒)的时间。然而,了解 Linux 内核的工作细节后可知, nanosleep 所提供的真正精确度是 10毫秒——比 sleep 提供的要精确。这个附加的精确度非常有用,比如说,可以根为反复进行的任务设置更短的间隔。 struct timespec 由两部分构成: tv_sec 表示整秒数部分; tv_nsec 则表示毫微秒。 tv_nesc 的值必须小于 109 。 nanosleep 相比 sleep 具有另一个优点。与 sleep 相同, nanosleep 调用可以被信号中断,这是 errno 将被设置为 EINTR 而调用将返回-1。但是, nanosleep 的第二个参数,另一个指向 struct timespec 对象的指针,如果不为 NULL 则在这种情况下它将被写入剩余的时间(这就是所请求的睡眠时间和实际睡眠时间的差)。这使重新开始睡眠变的很容易。头文件<> 。以下是内核中的: (); mdelay(); ndelay(); 实现的原理本质上都是忙等待, ndelay 和 mdelay 都是通过 udelay 衍生出来的,我们使用这些函数的实现往往会碰到编译器的警告 implicit declaration of function 'udelay' ,这往往是由于头文件的使用不当造成的。在 include/asm-???/ 中定义了 udelay (),而在 include/linux/ 中定义了 mdelay 和 一般适用于一个比较小的 delay ,如果你填的数大于 2000 ,系统会认为你这个是一个错误的 delay 函数,因此如果需要 2ms 以上的 delay 需要使用 mdelay 函数。 delay 函数本质上都是忙等待,对于长时间的忙等待意味这无谓的耗费着 cpu 的资源,因此对于毫秒级的延时,内核提供了 msleep , ssleep 等函数, 这些函数将使得调用它的进程睡眠参数指定的时间。那么,在 Windows 中呢: 1)我们很快想到 Sleep() ;头文件<> 然后再 VC++ 中,找到了一篇不错的文章,转自这里,内容如下: 方法一: VC 中的 WM_TIMER 消息映射能进行简单的时间控制。首先调用函数 SetTimer() 设置定时间隔,如 SetTimer(0,200,NULL) 即为设置200m s的时间间隔。然后在应用程序中增加定时响应函数 OnTimer() ,并在该函数中添加响应的处理语句,用来完成到达定时时间的操作。这种定时方法非常简单,可以实现一定的定时功能,但其定时功能如同 Sleep() 函数的延时功能一样,精度非常低,最小计时精度仅为 30ms , CPU 占用低,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应用。只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。如示例工程中的 Timer1 。方法二: VC 中使用 sleep() 函数实现延时,它的单位是 ms ,如延时 2秒, 用 sleep(2000) 。精度非常低,最小计时精度仅为 30ms ,用 sleep 函数的不利处在于延时期间不能处理其他的消息,如果时间太长,就好象死机一样, CPU 占用率非常高,只能用于要求不高的延时程序中。如示例工程中的 Timer2 。方法三:利用 COleDateTime 类和 COleDateTimeSpan 类结合 WINDOWS 的消息处理过程来实现秒级延时。如示例工程中的 Timer3 和 Timer3_1 。以下是实现 2秒的延时代码: COleDateTime start_time = COleDateTime::GetCurrent