手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

实战VC时间控制函数

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
随着软件和硬件的飞速发展,电脑技术已广泛地应用到自动化控制领域,为了实现实时控制,控制程式必须能够精确地完成定时和计时功能。VC提供了很多关于时间操作的函数,下面根据他们精度的不同,分别进行说明。

  一般时控函数

  VC程式员都会利用Windows的WM—TIMER消息映射来进行简单的时间控制:1.调用函数SetTimer()配置定时间隔,如SetTimer(0,200,NULL)即为配置200毫秒的时间间隔;2.在应用程式中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成时间到时的操作。这种定时方法是很简单的,但其定时功能如同Sleep()函数的延时功能相同,精度较低,只能够用来实现诸如位图的动态显示等对定时精度需要不高的情况,而在精度需要较高的条件下,这种方法应避免采用。

  精度时控函数

  在需要误差不大于1毫秒的情况下,能够采用GetTickCount()函数,该函数的返回值是DWORD型,表示以毫秒为单位的电脑启动后经历的时间间隔。使用下面的编程语句,能够实现50毫秒的精确定时,其误差小于1毫秒。

  DWORD dwStart, dwStop;

  // 起始值和终止值

  dwStop = GetTickCount();

  while(TRUE)

  {

   dwStart = dwStop;

  // 上一次的终止值变成新的起始值

  // 此处添加相应控制语句

   do

   {

  dwStop = GetTickCount();

   } while(dwStop - 50 < dwStart);

  }

  高精度时控函数

  对于一般的实时控制,使用GetTickCount()函数就能够满足精度需要,但要进一步提高计时精度,就要采用QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数。这两个函数是VC提供的仅供Windows 9X使用的高精度时间函数,并需要电脑从硬件上支持高精度计时器。QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型为:

  BOOL QueryPerformanceFrequency(LARGE—INTEGER *lpFrequency);

  BOOL QueryPerformanceCounter(LARGE—INTEGER *lpCount) ;

  数据类型LARGE—INTEGER既能够是个作为8字节长的整型数,也能够是作为两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:

  typedef union —LARGE—INTEGER

  {

   struct

   {

  DWORD LowPart; // 4字节整型数

  LONG  HighPart; // 4字节整型数

  };

  LONGLONG  QuadPart;

  // 8字节整型数

  } LARGE—INTEGER;

  在进行计时之前,应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。笔者在主频为266、300、333的三种PentiumⅡ机器上使用该函数,得到的时钟频率都是1193180Hz。接着,笔者在需要严格计时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差和时钟频率,就能够计算出事件经历的精确时间。以下程式是用来测试函数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;

  // 获得对应的时间值

  执行上面程式,得到的结果为dfTim=0.097143767076216(秒)。细心的读者会发现,每次执行的结果都不相同,存在一定的差别,这是由于Sleep()自身的误差所致。

  本文介绍了三种定时或计时的实现方法,读者能够根据自己的实际情况进行选择,以达到程式的定时和计时功能。以上程式均在VC 6.0、Windows 98环境下调试通过。




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS