这是一个检查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>
请告诉我原因。
答案 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";
}