//================================================================================================

20130806_第一次修改    
     
     
     
     
    ccb_david
//================================================================================================

   
休息了一个礼拜,开始自己课后的学习,想起数据结构课程设计里有同学实现了缓慢画点的功能,于是通过联系本人得到了他的源程序。仔细查看他的程序后,在其中发现了一个我以前没接触过的sleep函数,于是我也对了解sleep函数做了一些资料的查找。

   
首先我自己也进行了试验,发现确实在视觉上能减缓画点的速度,那么实现这个功能的实现形式是怎样的呢?为此我询问了我的老师,他告诉我sleep函数的主要功能是让系统暂停这个应用的运行(使用CPU)。由于这个回答比较简洁,为了了解更多关于sleep函数的信息,我在网上查找了一些资料。

首先sleep函数在不同的操作系统下参数的内容是不一样的:
Dos: 

sleep(1); //停留1秒 

delay(100);
//停留100毫秒

Windows: 

Sleep(100); //停留100毫秒 

Linux: 

sleep(1); //停留1秒 

usleep(1000); //停留1毫秒 


其次在windows里Sleep函数的“S”是大写的,其他的都是小写。

接着我查看了sleep函数在WINBASE.H的定义,定义如下:
WINBASEAPI
VOID
WINAPI
Sleep(
    DWORD
dwMilliseconds
    );

通过定义我们知道Sleep函数里参数是双字型参数,且单位为毫秒。




为了测试是否真如资料中所讲Sleep函数的精度能够保证,我编写下面的程序用于测试其精度。

由于我们需要使用for循环,为了循环本身可能存在的误差,我们先将一次循环大致需要的时间计算出来。
检测循环时间源码部分:
#include<iostream>
using namespace std;
#include <windows.h>

#pragma comment(lib, "Winmm.lib")

int main()
{
   
timeBeginPeriod(1);

    int max,min;
    max=0;
    min=500;

    for(int
i=0;i<100;i++)
    {
      DWORD
timeBegin = timeGetTime();//开始时间(毫秒级)

     
for(int j=0; j<100000000;
j++);//用于测算循环一亿次需要花费的时间

      DWORD
timeOver = timeGetTime();//结束时间(毫秒级)

      if(
timeOver-timeBegin > max )
     
  max=timeOver-timeBegin;
      if(
timeOver-timeBegin < min )
     
  min=timeOver-timeBegin;
    }

   
cout<<"max
="<<max<<endl;
   
cout<<"min
="<<min<<endl;

    return 0;
}
经过运行我们可以得到循环一亿次for循环大概花费的时间在222-249毫秒之间,这样估计大约一次for循环花费的时间是2.22-2.49
ns,基本可以排除循环所带来的误差。


检测sleep函数延迟时间源码部分:
#include<iostream>
using namespace std;
#include <windows.h>

#pragma comment(lib, "Winmm.lib")

int main()
{
  timeBeginPeriod(1);//设置定时器的分辨率

  int a[100];
  int x0,y0;
  int x1,y1;
  x1=y1=100;
  x0=y0=0;

  while(x1)//为数组a赋初始值
  {
    a[x0]=0;
    x0++;
    x1--;
  }

  for(int i=0;i<100;i++)
  {
    DWORD timeBegin =
timeGetTime();//开始时间(毫秒级)

    Sleep(50);

    DWORD timeOver =
timeGetTime();//结束时间(毫秒级)

   
a[i]=timeOver-timeBegin;
  }

  //为了保证输出流不影响测试,我们将输出放在测试循环外
  while(y1)//将所有数组里记录的数据全部输出
  {
   
cout<<"第"<<y0+1<<"次用时:"<<a[y0]<<"
毫秒。"<<endl;
    y0++;
    y1--;
  }

  return 0;
}
经过运行我们可以得到100个输出,其中只有1个输出为51其他均为50,根据这些数据,我们可以基本认为,sleep函数的精度基本上可以说在1毫秒左右。

*注:如果讲究严谨,我们还需要考虑三个赋值运算与一个减法运算。但是通过汇编语言层面我们可以知道,赋值与减法运算在寄存器内部进行操作,所以在这个测试中我们基本可以排除赋值运算与减法运算对我们本次测试的影响。





即使有一天在技术上我已经是个能手,请记住自己应有的责任和保持一个真诚交流、始终渴望追求技术的心。
 
     
     
     
     
     
     
     
     
     
     
     
----------ccb_warlock

关于sleep函数的一些问题和资料的更多相关文章

  1. jQuery 2.0.3 源码分析Sizzle引擎 - 编译函数(大篇幅)

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 从Sizzle1.8开始,这是Sizzle的分界线了,引入了编译函数机制 网上基本没有资料细说这个东东的,sizzle引入这 ...

  2. probe函数何时调用的

    转自:http://blog.csdn.net/xiafeng1113/article/details/8030248 Linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名 ...

  3. 本函数用来改变目前 php 执行的目录到新的 directory 目录中

    chdir : 改变目录. dir : 目录类别类. closedir : 关闭目录 handle. opendir : 打开目录 handle. readdir : 读取目录 handle. rew ...

  4. c语言之函数指针

    一.基础研究 这里研究的内容是函数指针,需要我们在研究后构造程序来描述函数指针数组的用法和向函数传函数指针的方法. 指针有很多种:整型指针.结构体指针.数组指针等等,它们的本质是它们的值都是一个地址, ...

  5. C51函数的递归调用

    前几天在写C51程序时用到了递归,简单程序如下: void WRITE_ADD(uchar addr,uchar wbyte) { START(); //先发送起始信号 WRITE_BYTE(0xa0 ...

  6. 如何使用getopt()函数解析参数

    最近在写程序的过程中,把一部分时间都花费在程序对参数的处理上.今天听了学长说到getopt函数,才发现原来c里面还有一个专门解决参数处理的函数,查询了相关资料,这里简单总结一下. 使用int main ...

  7. linux中 probe函数的何时调用的?

    点击打开链接 linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名字匹配,BUS就会调用驱动的probe函数,但是有时我们要看看probe函数里面到底做了什么,还有传递给p ...

  8. HashMap中的hash函数

    在写一个HashSet时候有个需求,是判断HashSet中是否已经存在对象,存在则取出,不存在则add添加.HashSet也是通过HashMap实现,只用了HashMap的key,value都存储一个 ...

  9. SQLITE3 使用总结(直接使用C函数)

    转载网址:http://blog.chinaunix.net/uid-8447633-id-3321394.html 前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总 ...

随机推荐

  1. Docker 使用教程

    概括  Docker与传统虚拟机的区别 与传统虚拟机的区别  Docker的安装 的安装  Docker daemon , client , containerd  镜像与容器操作  容器运 ...

  2. 算法训练 区间K大数

    算法训练 区间k大数查询 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. ...

  3. 16进制到byte转换

    我们经常会看到这样的语法 (byte) 0xAD 0xAD实际是个16进制,转换成二进制为:10101101,转换成10进制是:173,它是个正数 10101101只是int的简写,int由4个byt ...

  4. python3 三级菜单-基础版

    # -*- coding:utf-8 -*- data = { "北京":{ "东城区":{ "安定门":["国子监", ...

  5. 浏览器Agent大全 (含IE 11, Edge)

    Edge mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/51.0.27 ...

  6. mybatis延迟加载一对多

    1.实体类 package cn.bdqn.bean; import java.util.Set; /** *国家的实体类 */ public class Country { private Inte ...

  7. NGUI_PopupList

    八.PopuList下拉菜单 1.使用Populist的规律: (1).有一系列选项需要玩家做出选择,这些选项是有限多个的. (2).这些选项玩家必须选择一个,也只能选择一个. (3).这些选项如果全 ...

  8. iOS 读书笔记-国际化

    吐槽一下:国际化-我想说学习的这个project好痛苦. 也许是百度的原因,总是不能找到自己想要东西. 找到的内容不是不具体就是时间有点久了.让我这种小白非常头痛. 以下记录一下整个过程. 国际化是什 ...

  9. javascript变量:全局?还是局部?这个得注意

    在JS中.是没有块级作用域的 举两个个样例: if语句块:     if (true){ var name='Ling'; } alert(name); 输出:Ling for语句块; for(var ...

  10. Java中用Apache POI生成excel和word文档

    概述: 近期在做项目的过程中遇到了excel的数据导出和word的图文表报告的导出功能.最后决定用Apache POI来完毕该项功能.本文就项目实现过程中的一些思路与代码与大家共享.同一时候.也作为自 ...