MS Windows Timer的限制以及如何使用更高分辨率的计时手段。

原创 2004年08月27日 16:51:00
 

MS Windows Timer的限制以及如何使用更高分辨率的计时手段。

Windows的计时器(Timer)的分辨率是有限制的,从Programming Windows(5th)可以获知,

Win9x系列,这个限制是:计数器最小只能55毫秒间隔计数一次。

这个限制是这样计算出来的,8086/8088的主频4.772720 MHz除以218次方,求得

18.2,也就是每秒18.2次。一次间隔大约在55秒。

WinNT系列(包括2000/XP/Server 2003),最小只能10毫秒间隔计数一次。

对于比最低限制低的情况,以最低限制算。

实际上Win32 API为我们提供了两个函数:

BOOL QueryPerformanceFrequency(
  LARGE_INTEGER* lpFrequency
);
BOOL QueryPerformanceCounter(
  LARGE_INTEGER* lpPerformanceCount
);

可以利用它们获得更高分辨率的计时手段.

第一个函数获取你当前CPU的每秒计数值,比如在我的PIII 500MHz上是3579545

第二个函数获取你开机至现在的计数值(注意:休眠的时间也计数在里面的。)。两次调用就可以求出调用的间隔时间了。

更具体的说明可以查阅Msdn

下面是一个应用实例,他会在1毫秒内进行一次排序算法,共运行10秒,就是10000次排序算法,如果你看到控制台光标闪了10下(1秒一下),那就说明这个算法在当前CPU上可以在1毫秒内完成。不过如果算法运算的时间超过1毫秒,那么运行时间肯定不止10秒了。

 

#include <windows.h>

#include <iostream>

#include <stdlib.h>

#include <algorithm>

#include <vector>

using namespace std;

 

const size_t MAXSIZE = 1000;

void do_something()

{

       // Do something

       vector<float> array(MAXSIZE);

       for (size_t i=0; i<MAXSIZE; ++i)

       {

              array[i] = rand() % 9999;

       }

       sort(array.begin(), array.end());

}

 

int main()

{

         LARGE_INTEGER begin;

         LARGE_INTEGER end;

         LARGE_INTEGER countsPerSec;    // 当前CPU的一秒计数次数

         size_t divisionNum = 1000;   // 1秒的分割次数

         LONGLONG intervalSec;          // 分割后的计数次数,即执行一次算法的间隔秒数

         static size_t count = 0;

         size_t TotalSec = 10;            // 总执行 秒数

 

         QueryPerformanceFrequency (&countsPerSec);

         intervalSec = countsPerSec.QuadPart / divisionNum;     

 

         while (1)

         {

                QueryPerformanceCounter (&begin);

               

                do_something();

         

                while (1)

                {

                     QueryPerformanceCounter (&end);

                    if (end.QuadPart - begin.QuadPart >= intervalSec)

                    {

                           break;

                    }

                }

 

                ++ count;

 

                if (count == TotalSec *divisionNum)

                {

                       cout << "finish" << endl;

                       break;

                }

         }

         system("pause");

}

 

题外话: Windows毕竟是通用操作系统,对于实时响应的实现光靠提高高分辨率的计时器还是不够的。不过Windows也是可以配置成

        满足一定实时性的操作系统。WindowsXp就有人在做实时扩展方面的工作。

timer控件 倒计时 顺时计时 重置计时

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy...
  • querystringcom
  • querystringcom
  • 2015年05月21日 16:27
  • 620

三种定时器Timer的使用

 在.net中有三种计时器,一是System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet;二是System.Timers命名空间下的Timer类。 Ti...
  • CSDNwei
  • CSDNwei
  • 2015年12月30日 16:21
  • 9397

Java:如何正确使用Timer【java定时器的使用(Timer) 】

Timer是最常被使用到的工具类,使用Timer来调度TimerTask的实现者来执行任务
  • yueaini10000
  • yueaini10000
  • 2016年04月26日 11:02
  • 17456

让服务不再停止(在Windows Service中使用Timer的技巧)

平时在开发中,经常遇到的一个需求就是,要开发一个后台的程序,来监视数据库中某些数据的变化,并且发生变化以后要立刻做出响应。 实际上呢,我们会建立一个Windows Service工程,在里面放一...
  • lvjin110
  • lvjin110
  • 2013年12月14日 23:03
  • 1278

Windows中定时器Timer使用中的注意事项

在任何语言任何操作系统下的开发中,定时器都是一个必不可少的功能,大部分的操作系统和语言都有内置的定时器接口可供调用。在windows API中有一组定时器相关函数,包括CreateTimerQueue...
  • vegeta34
  • vegeta34
  • 2017年02月08日 23:02
  • 734

Timer和TimeTask类(定时调度)学习之秒表计时器

最近在做一个自己的小项目,用到了定时调度(Timer和TimeTask类),特做此记录 Timer类: Timer类是一种线程设施,可以用来实现在某一个时间或某一段时间后,安排某一个任务执行一次,或定...
  • wei18359100306
  • wei18359100306
  • 2015年01月02日 23:53
  • 2678

【STM32】STM32之timer2的精准延时

本文介绍STM32系列如何使用timer2进行精确定时
  • feilusia
  • feilusia
  • 2017年01月15日 00:57
  • 1057

boost::timer之时间处理器

提示: timer类主要是用于测量时间的间距,是一个小型的计时器。时间可以精确到毫秒级。 具体示例: #include #include int _tmain(int argc, _TCHAR*...
  • qingzai_
  • qingzai_
  • 2015年03月20日 19:06
  • 934

FreeRTOS timer定时器源码分析

vTaskStartScheduler( )      xTimerCreateTimerTask();           /*创建一个后台守护任务*/            xTaskCreate...
  • wang112031
  • wang112031
  • 2016年01月21日 19:39
  • 3268

STM32高分辨率定时器(HRTIM)使用笔…

STM32高分辨率功能非常强大,寄存器数量非常多,使用起来也比较麻烦,本文使用HRTIM1产生一组互补输出的PWM 高分辨率定时器的初始化比普通定时器要复杂得多,  HRTIM_OutputCfgT...
  • Wind4study
  • Wind4study
  • 2016年11月27日 19:53
  • 1293
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MS Windows Timer的限制以及如何使用更高分辨率的计时手段。
举报原因:
原因补充:

(最多只允许输入30个字)