Sleep()函数用法

时间:2012-03-22 15:14:15

标签: c++ sleep clock timing

这是一个检查Sleep()函数功能的示例pgm。这是一个演示,因为我在我的app开发中使用了这个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()来计算时间。 由于我使用睡眠(30000),时间差异将至少为30000。

我已多次运行此prgm。打印输出为30000,30001,30002。这些都可以。但有时我会得到像29999和29997这样的值。这怎么可能,因为我把30000睡眠时钟()。(/ p>

请告诉我原因。

4 个答案:

答案 0 :(得分:5)

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

  

系统时钟&#34;滴答&#34;以恒定的速度。如果dwMilliseconds小于系统时钟的分辨率,则线程可能会睡眠时间少于指定的时间长度。如果dwMilliseconds大于一个tick但小于2,则等待可以是一到两个滴答之间的任何位置,依此类推。

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

如果您真的需要,同一页面会为您提供一种增加计时器分辨率的方法。

还有high resolution timers可能更符合您的需求。

答案 1 :(得分:3)

除非您使用的是实时操作系统,否则非常期待。

操作系统必须安排并运行许多其他进程,因此唤醒您的进程可能与您想睡觉的确切时间不匹配。

答案 2 :(得分:1)

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

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

此外,您可以尝试使用timeBeginPeriod通过调用timeGetDevCaps返回的wPeriodMin来获取最大中断频率。

为了使睡眠与系统中断周期同步,我也建议 在第一次“时间捕获”之前睡一觉(1)。

通过这样做,“太短路”将消失。

更多信息可以找到暂停睡眠here

答案 3 :(得分:0)

#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";
}