您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:165 来源:vckbase.com

本文章共5088字,分4页,当前第3页,快速翻页:
 
  具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在LpTimeProc回调函数 中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是,任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后, 应及时调用timeKillEvent()将之释放。
逆风编程精品
  方式七:对于精确度要求更高的定时操作,则应该使用QueryPerformanceFrequency()和 QueryPerformanceCounter()函数。这两个函数是VC提供的仅供Windows 95及其后续版本使用的精确时间函数,并要求计算机从硬件上支持精确定时器。如示例工程中的Timer7、Timer7_1、Timer7_2、Timer7_3。
QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型如下:
       BOOL  QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

       BOOL  QueryPerformanceCounter(LARGE_INTEGER *lpCount);
  数据类型ARGE_INTEGER既可以是一个8字节长的整型数,也可以是两个4字节长的整型数的联合结构, 其具体用法根据编译器是否支持64位而定。该类型的定义如下:
       typedef union _LARGE_INTEGER

       {

           struct

           {

              DWORD LowPart ;// 4字节整型数

              LONG  HighPart;// 4字节整型数

           };

           LONGLONG QuadPart ;// 8字节整型数

           

        }LARGE_INTEGER ;
  在进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率, 然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经 历的精确时间。下列代码实现1ms的精确定时:
       LARGE_INTEGER litmp; 

       LONGLONG QPart1,QPart2;

       double dfMinus, dfFreq, dfTim; 

       QueryPerformanceFrequency(&litmp);

       dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率

       QueryPerformanceCounter(&litmp);

       QPart1 = litmp.QuadPart;// 获得初始值

       do

       {

          QueryPerformanceCounter(&litmp);

          QPart2 = litmp.QuadPart;//获得中止值

          dfMinus = (double)(QPart2-QPart1);

          dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒

       }while(dfTim<0.001);
  其定时误差不超过1微秒,精度与CPU等机器配置有关。 下面的程序用来测试函数Sleep(100)的精确持续时间:
       LARGE_INTEGER litmp; 

       LONGLONG QPart1,QPart2;

       double dfMinus, dfFreq, dfTim; 

       QueryPerformanceFrequency(&litmp);

       dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率

       QueryPerformanceCounter(&litmp);

       QPart1 = litmp.QuadPart;// 获得初始值

       Sleep(100);

       QueryPerformanceCounter(&litmp);

       QPart2 = litmp.QuadPart;//获得中止值

       dfMinus = (double)(QPart2-QPart1);

       dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒     
  由于Sleep()函数自身的误差,上述程序每次执行的结果都会有微小误差。下列代码实现1微秒的精确定时:
 
本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 下一页>>
相关文章

DLL初学者指南(非MFC)
如何使用BHO定制你的Internet Explorer浏览
使用socket套接字时的两点经验
Visual Basic .NET 中多 Windows 窗体的同步
可以替代系统记事本的程序
论程序设计方法
图形显示特技算法
SQL Server 索引结构及其使用(三)
简单实用的Xml解析类
一个实用的CToolBar扩展类CToolBarEx
模拟 Windows 下 CPU 占用率的控件及其实现
自动隐藏停泊窗体实现
Buffer Overruns,portability和其它...
在你的程序中如何使用CButtonST类
QQ2006 界面编程之鸡蛋里挑骨头
用 Web 服务进行二进制序列化和 BinaryForm
DLL头文件的格式和应用
如何在 C# 中加载自己编写的动态链接库
软件测试悖论
VC 操作 SQL Server 主从表

相关评论


本文章所属分类:首页 VC++

  热门关键字: