background image

VC

 

知识库文章

- VC

 

中基于

Windows 

 

的精确定时

 

              在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕

 

上的进度条,上位
            机定时向下位机发送命令和传送数据等。特别是在对控制性能要求较高的实时控制系统和数据采
集系统中,就更需要精确定时操作。
              众所周知,Windows 是基于消息机制的系统,任何事件的执行都是通过发送和接收消息来

 

完成的。
            这样就带来了一些问题,如一旦计算机的 CPU 被某个进程占用,或系统资源紧张时,发送到消息

 

队列
            中的消息就暂时被挂起,得不到实时处理。因此,不能简单地通过 Windows 消息引发一个对定时

 

要求
            严格的事件。另外,由于在 Windows 中已经封装了计算机底层硬件的访问,所以,要想通过直接

 

利用
            访问硬件来完成精确定时,也比较困难。所以在实际应用时,应针对具体定时精度的要求,采取

 

相适 应的定时方法。
              VC 中提供了很多关于时间操作的函数,利用它们控制程序能够精确地完成定时和计时操作。

 

本文详细介绍了
            VC 中基于 Windows 的精确定时的七种方式,如下图所示:

            

 

 

图一 图像描述

              方式一:VC 中的 WM_TIMER 消息映射能进行简单的时间控制。首先调用函数 SetTimer()

 

设置定时
            间隔,如 SetTimer(0,200,NULL)即为设置 200ms 的时间间隔。然后在应用程序中增加定时

 

响应函数
            OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间的操作。这种定时方法

 

非常
            简单,可以实现一定的定时功能,但其定时功能如同 Sleep()函数的延时功能一样,精度非常低,

 

最小
            计时精度仅为 30ms,CPU 占用低,且定时器消息在多任务操作系统中的优先级很低,不能得到及

 

时响
            应,往往不能满足实时控制环境下的应用。只可以用来实现诸如位图的动态显示等对定时精度要
求不高的情况。如示例工程中的

Timer1  

              方式二:VC 中使用 sleep()函数实现延时,它的单位是 ms,如延时 2 秒,用

sleep(2000)

 

。精度非常

            低,最小计时精度仅为 30ms,用 sleep 函数的不利处在于延时期间不能处理其他的消息,如果

 

时间太
            长,就好象死机一样,CPU 占用率非常高,只能用于要求不高的延时程序中。如示例工程中的

Timer2。
              方式三:利用 COleDateTime 类和 COleDateTimeSpan 类结合 WINDOWS 的消息处理过程
来实现秒级延时。如示例工程中的

Timer3 和 Timer3_1。以下是实现 2

 

秒的延时代码:

      COleDateTime      start_time = COleDateTime::GetCurrentTime();

      COleDateTimeSpan  end_time= COleDateTime::GetCurrentTime()-start_time;
      while(end_time.GetTotalSeconds()< 2) //实现延时 2 秒

     { 
              MSG   msg;

              GetMessage(&msg,NULL,0,0);
              TranslateMessage(&msg); 

              DispatchMessage(&msg);
              

             //以上四行是实现在延时或定时期间能处理其他的消息,

 

      

//虽然这样可以降低 CPU 的占有率,

             //但降低了延时或定时精度,实际应用中可以去掉。
             end_time = COleDateTime::GetCurrentTime()-start_time;