Sleep()函数用法

Sleep() function usage

本文关键字:用法 函数 Sleep      更新时间:2023-10-16

这是一个用于检查Sleep()函数功能的示例pgm。这只是一个演示,因为我在应用程序开发中使用了sleep()和clock()函数。

  // TestTicks.cpp : Defines the entry point for the console application.
  //
  #include "stdafx.h"
  #include<iostream>
  #include<iomanip>
  #include <Windows.h>
  int _tmain(int argc, _TCHAR* argv[])
  {
    int i, i2;
    i = clock();
    //std::cout<<" nTime before Sleep() : "<<i;
    Sleep(30000);
    i2 = clock();
    //std::cout<<" nTime After Sleep() : "<<i2;
    std::cout<<"n Diff : "<<i2 -i;
    getchar();
      return 0;
  }

在这段代码中,我使用clock()计算sleep函数前后的时间。由于iam使用睡眠(30000),因此时间差至少为30000。

我已经运行这个程序很多次了。打印输出为300003000130002。这些都可以。但有时我会得到像29999和29997这样的值。这怎么可能呢,因为我把30000睡眠b/w放在了时钟()上。

请告诉我原因。

根据http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx:

系统时钟以恒定的速率"滴答"作响。如果dwMilliseconds小于系统时钟的分辨率,则线程的睡眠时间可能小于指定的时间长度。如果dwMilliseconds大于一个刻度但小于两个刻度,则等待可以在一到两个刻度之间,依此类推

这只是意味着睡眠功能永远不会在给定的时间内完全睡眠,但在调度器的分辨率下尽可能接近。

如果你真的需要,同一页提供了一种提高计时器分辨率的方法

还有高分辨率定时器,可能更适合您的需求。

除非您使用的是实时操作系统,否则这是意料之中的事。

操作系统必须安排和运行许多其他进程,所以唤醒你的进程可能与你想要睡觉的确切时间不匹配。

clock()函数告诉调用进程使用了多少处理器时间。

您可以将clock()的使用替换为函数GetSystemTimeAsFileTime以便更准确地测量时间。

此外,您可以尝试将timeBeginPeriod与调用timeGetDevCaps返回的wPeriodMin一起使用,以获得最大中断频率。

为了使睡眠与系统中断时间同步,我还建议在第一次"时间捕捉"之前进行睡眠(1)。

这样一来,"短裤"就会消失。

有关计数睡眠的更多信息可以在这里找到

#include <iostream> 
#include <time.h>  
void wait(int seconds) 
{ 
    int endwait; 
    endwait = clock() + seconds * CLOCKS_PER_SEC ; 
    while (clock() < endwait){} 
} 
int main() 
{ 
    wait(2);
    cout<<"2 seconds have passed";
}