`
deepfuture
  • 浏览: 4412953 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80136
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70360
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103607
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:286603
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15056
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67813
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32293
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:46075
社区版块
存档分类
最新评论

WINDOWS实现精确定时程序

阅读更多
一.原理及相关API
WINDOWS正确定时,不同的CPU频率可以指定同一时间间隔。
使用QueryPerformanceFrequency的API,指定每秒的频率。QueryPerformanceFrequencyFunction查询每秒的行为频率,这个频率在整个系统运行过程中不被改变。

The QueryPerformanceFrequency function retrieves thefrequency of the high-resolution performance counter, if oneexists. The frequency cannot change while the system isrunning.

Syntax

BOOL QueryPerformanceFrequency(      
    LARGE_INTEGER *lpFrequency);

Parameters

lpFrequency
[out] Pointer to a variable that receives thecurrent performance-counter frequency, in counts per second. If theinstalled hardware does not support a high-resolution performancecounter, this parameter can be zero.

Return Value

If the installed hardware supports a high-resolution performancecounter, the return value is nonzero.

If the function fails, the return value is zero. To get extendederror information, call GetLastError. Forexample, if the installed hardware does not support ahigh-resolution performance counter, the function fails.


Function Information

Minimum DLL Version Header Import library Minimum operating systems Unicode
kernel32.dll
Declared in Winbase.h, includeWindows.h
Kernel32.lib
Windows 95, WindowsNT 3.1
Implemented as Unicode version.

See Also

Timers Overview,QueryPerformanceCounter

 

QueryPerformanceCounter返回当前频率值。

二.代码例子

////////////////////////////////////////////////////////////////////

 

#include "CTimer.h"

//---------------------- default constructor------------------------------
//
//-------------------------------------------------------------------------
CTimer::CTimer(): m_FPS(0),
             m_TimeElapsed(0.0f),
             m_FrameTime(0),
             m_LastTime(0),
             m_PerfCountFreq(0)
{
 //how many ticks per sec do we get

//返回系统每秒频率
 QueryPerformanceFrequency( (LARGE_INTEGER*)&m_PerfCountFreq);
// m_TimeScale 为每频率占用的秒数
 m_TimeScale = 1.0f/m_PerfCountFreq;
}

//---------------------- constructor-------------------------------------
//
// use to specify FPS
//
//-------------------------------------------------------------------------
CTimer::CTimer(float fps): m_FPS(fps),
                    m_TimeElapsed(0.0f),
                    m_LastTime(0),
                    m_PerfCountFreq(0)
{

 //how many ticks per sec do we get

//返回系统每秒频率
 QueryPerformanceFrequency( (LARGE_INTEGER*)&m_PerfCountFreq);

 m_TimeScale = 1.0f/m_PerfCountFreq;

 //calculate ticks per frame

//m_FPS为你希望系统每秒多少频率

//m_FrameTime为你设定的每频率相当于系统实际多少频率.可理解为每频率多少时间
 m_FrameTime = (LONGLONG)(m_PerfCountFreq /m_FPS);
}


//------------------------Start()-----------------------------------------
//
// call this immediately prior to game loop.Starts the timer (obviously!)
//启动定时器
//--------------------------------------------------------------------------
void CTimer::Start()
{
 //get the time
 QueryPerformanceCounter( (LARGE_INTEGER*)&m_LastTime);

 //update time to render next frame

//m_LastTime为定时开始前的时间

// m_NextTime为下次定时到了的时间.
 m_NextTime = m_LastTime + m_FrameTime;

 return;
}

//-------------------------ReadyForNextFrame()-------------------------------
//
// returns true if it is time to move on to thenext frame step. To be used if
// FPS is set.
//检测定时是否已经到了
//----------------------------------------------------------------------------
bool CTimer::ReadyForNextFrame()
{
 if (!m_FPS)
  {
   MessageBox(NULL, "No FPS set in timer", "Doh!", 0);

    returnfalse;
  }
 
  QueryPerformanceCounter( (LARGE_INTEGER*)&m_CurrentTime);

 if (m_CurrentTime >m_NextTime)
 {//定时到了

//  m_TimeElapsed为本次定时用了多少秒

//更新定时开始前的时间 m_LastTime 

  m_TimeElapsed =(m_CurrentTime - m_LastTime) * m_TimeScale;
  m_LastTime  =m_CurrentTime;

  //update time to render nextframe
  m_NextTime = m_CurrentTime +m_FrameTime;

  return true;
 }

 return false;
}

//--------------------------- TimeElapsed--------------------------------
//
// returns time elapsed since last call to thisfunction. Use in main
// when calculations are to be based on dt.
//
//-------------------------------------------------------------------------
double CTimer::TimeElapsed()
{

//得到本次定时已经用了多少秒
 QueryPerformanceCounter( (LARGE_INTEGER*)&m_CurrentTime);
 
 m_TimeElapsed = (m_CurrentTime -m_LastTime) * m_TimeScale;
 
 m_LastTime  =m_CurrentTime;

 return m_TimeElapsed;
  
}

 

 

========================================================================================

/////////////////////////////////////

///////////////////////////////////////

///////////////////////////////////////

 

#ifndef CTIMER_H
#define CTIMER_H
//-----------------------------------------------------------------------
//
//  Name: CTimer.h
//
//  Author: Mat Buckland 2002
//
// Desc: Windows timer class for the book GameAI
//  Programming with Neural Nets and GeneticAlgorithms.
//
//-----------------------------------------------------------------------

#include


class CTimer
{

private:

 LONGLONG m_CurrentTime,
          m_LastTime,
       m_NextTime,
       m_FrameTime,
       m_PerfCountFreq;

 double  m_TimeElapsed,
       m_TimeScale;

 float   m_FPS;


public:

  //ctors
 CTimer();
 CTimer(float fps);


 //whatdayaknow, this starts the timer
 void  Start();

 //determines if enough time has passed to moveonto next frame
 bool  ReadyForNextFrame();

 //only use this after a call to theabove.
 double GetTimeElapsed(){returnm_TimeElapsed;}

 double TimeElapsed();

};

 

#endif

 

三.使用举例


int WINAPI WinMain (HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR    szCmdLine,
                   int      iCmdShow)
{
    //handle to our window
  HWND      hWnd;
   
   //our window classstructure
  WNDCLASSEX    winclass;
  
    // first fill in the window class stucture
   winclass.cbSize       = sizeof(WNDCLASSEX);
   winclass.style        = CS_HREDRAW | CS_VREDRAW;
    winclass.lpfnWndProc   =WindowProc;
    winclass.cbClsExtra   = 0;
    winclass.cbWndExtra   = 0;
    winclass.hInstance    = hInstance;
    winclass.hIcon        = LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor      = LoadCursor(NULL, IDC_ARROW);
    winclass.hbrBackground = NULL;
    winclass.lpszMenuName  = NULL;
    winclass.lpszClassName = g_szWindowClassName;
   winclass.hIconSm      = LoadIcon(NULL, IDI_APPLICATION);

   //register the windowclass
  if(!RegisterClassEx(&winclass))
  {
   MessageBox(NULL,"Registration Failed!", "Error", 0);

   //exit theapplication
   return0;
  }

   //create the window andassign its ID tohwnd   
    hWnd = CreateWindowEx(NULL,                // extended style
                           g_szWindowClassName,  // window class name
                           g_szApplicationName,  // window caption
                           WS_OVERLAPPEDWINDOW,  // window style
                           0,                   // initial x position
                           0,                   // initial y position
                           WINDOW_WIDTH,        // initial x size
                           WINDOW_HEIGHT,       // initial y size
                           NULL,                // parent window handle
                           NULL,                // window menu handle
                           hInstance,           // program instance handle
                           NULL);               // creation parameters

    //make sure the window creation has gone OK
    if(!hWnd)
    {
      MessageBox(NULL, "CreateWindowEx Failed!", "Error!", 0);
    }
        
    //make the window visible
   ShowWindow (hWnd,iCmdShow);
    UpdateWindow (hWnd);

    // Enterthe message loop
    bool bDone =false;

    //create a timer
   CTimertimer(FRAMES_PER_SECOND);

   //start the timer
   timer.Start();

    MSG msg;

   while(!bDone)
    {
     
    while(PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
    {
    if( msg.message == WM_QUIT )
    {
     // Stop loop if it's a quit message
     bDone = true;
    }

    else
    {
     TranslateMessage( &msg );
     DispatchMessage( &msg );
    }
    }

  if(timer.ReadyForNextFrame())
  {
    //**any gameupdate code goes in here**
     
     //this will call WM_PAINT which will render our scene
   InvalidateRect(hWnd,NULL, TRUE);
   UpdateWindow(hWnd);
    }
       
    }//endwhile

    UnregisterClass( g_szWindowClassName, winclass.hInstance );

    return msg.wParam;
}

分享到:
评论

相关推荐

    VC精确定时程序

    总结,"VC精确定时程序"涉及了Windows API定时器、高精度计时器、多线程异步编程等多个方面,通过深入学习和实践,开发者能够掌握更精确控制程序运行时间的技巧,从而提升软件的性能和用户体验。对于...

    VC中基于Windows 的精确定时

    在VC++ 6.0开发环境中,实现基于Windows的精确定时是一项常见的需求,尤其是在进行实时系统编程或者游戏开发时。本项目通过提供详细的说明和源代码,旨在帮助开发者掌握如何在Windows平台上实现高精度的时间控制。 ...

    VC中基于 Windows 的精确定时

    在Microsoft Visual C++ (VC) 开发环境中,创建基于Windows的精确定时程序是一项常见的任务。Windows操作系统提供了多种定时机制,这些机制可以帮助开发者实现不同精度和应用场景的定时需求。本篇将详细介绍如何在VC...

    计算机CPU精确定时程序(vs工程).zip

    本资源提供了一个关于精确定时程序的实践案例,通过VS工程的形式,包括了三种不同的定时方法。让我们详细探讨一下这些方法及其背后的原理。 首先,"设定值精确定时"小程序可能是通过直接操作硬件计时器来实现的。在...

    VC中基于 Windows 的精确定时hur.cn或vip.hur.cn.rar

    在VC++编程环境中,开发基于Windows的精确定时程序是一项重要的任务,这通常涉及到系统级的时间管理和多线程同步。本文将深入探讨如何在VC++中实现这样的功能,并结合"VC中基于 Windows 的精确定时hur.cn或vip.hur....

    C++精确定时定时器例子

    本文将详细介绍一种在Visual C++(简称VC)环境下实现Windows精确定时的方法,并通过七个具体的实例进行说明。 #### 定时方法详解 ##### 方式一:WM_TIMER 消息映射 - **原理**:通过`SetTimer()`函数设置定时器,...

    论文《基于Windows 系统环境下的精确定时过程实现》

    ### 论文《基于Windows 系统环境下的精确定时过程实现》知识点解析 #### 一、引言 本文档是一篇学术论文摘要,题目为《基于Windows 系统环境下的精确定时过程实现》。该论文由吴益明、卢京潮、魏莉莉、闫建国等人...

    VC中基于 Windows 的精确延时(最全)

    在VC++编程环境中,开发Windows应用程序时,常常需要实现精确的延时功能,这在处理时间敏感的任务或者进行性能测试时尤为重要。本文将详细探讨如何在VC++中利用Windows API来实现这种精确延时。 首先,Windows API ...

    基于80×86CPU和Windows平台的实时测控系统精确定时.pdf

    综上所述,对于基于80x86 CPU和Windows平台的实时测控系统,实现精确定时可以通过利用多媒体定时器、内核定时器或直接操作硬件中断等技术。具体选择哪种方法,需要根据实际应用场景、系统资源和开发能力来决定。同时...

    多媒体精确定时时钟源码

    这个"多媒体精确定时时钟源码"很可能是通过Windows API实现了以上的一种或多种技术,以提供在MFC应用中实现精确到毫秒级别的时间控制。学习和理解这个源码,可以帮助开发者深入理解实时系统和多媒体应用的底层工作...

    高精度定时程序(微秒级)源代码 highrestimer

    基于Windows 的高精度实时定时程序,精度可达到微秒级,可以用来发送串口数据等

    精确定时,精度到us

    "精确定时,精度到us"的标题表明我们关注的是一个能够实现微秒级别精度的定时技术。描述中提到的问题是,使用标准的`Sleep()`函数在Windows环境中进行延迟时,当时间间隔小于100毫秒,其精度往往无法满足需求。`...

    VB精确定时

    在Visual Basic (VB) 开发环境中,实现精确定时是一项常见的需求,特别是在需要精确控制时间间隔的应用场景中。本篇文章将详细解析如何通过调用`GetTickCount`函数实现精确的定时功能,并对相关代码片段进行深入分析...

    多线程 启动控制台 精确定时 WaitForSingleObject

    总的来说,理解多线程、启动控制台和精确定时的概念,并掌握`WaitForSingleObject`的使用,对于编写高效、可靠的并发程序至关重要。在实际开发中,这些技术广泛应用于服务器程序、实时系统、游戏引擎等多个领域。...

    定时关机---自制小程序

    总结来说,"定时关机---自制小程序"是利用BCB开发的一个实用工具,它通过调用Windows API实现了定时关机功能,且具有低资源占用和托盘最小化特性,为用户提供了便捷的电脑自动化管理方式。对于那些需要定时关机的...

    Windows高精度定时器(VC++实现)

    总结来说,"Windows高精度定时器(VC++实现)"是利用Windows消息机制和高级计时API实现的,主要目标是提供毫秒级精度的定时服务,便于开发者在需要精确控制时间的场景下进行编程。`MessageTimer`类可能是这一实现的...

    定时关机小程序

    【Win定时器】这个标签可能是指程序利用了Windows操作系统提供的定时服务,例如SetTimer API,来实现精确的定时功能。Windows定时器能够在后台运行,即使用户已经离开了桌面,也能按照预定计划执行任务。 至于...

    c# winform 定时开启关闭小程序

    这个程序允许用户设置定时任务,以精确到秒的精度自动启动或关闭指定的应用程序。要实现这样的功能,我们需要理解C#的基础知识,WinForm的UI设计,以及如何处理定时任务。 首先,`C#`是微软公司推出的一种面向对象...

Global site tag (gtag.js) - Google Analytics