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。

时间: 2024-11-03 18:15:41

VC中基于Windows的精确定时的相关文章

VC中基于 Windows 的精确定时

在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位 机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要精确定时操作. 众所周知,Windows 是基于消息机制的系统,任何事件的执行都是通过发送和接收消息来完成的. 这样就带来了一些问题,如一旦计算机的CPU被某个进程占用,或系统资源紧张时,发送到消息队列 中的消息就暂时被挂起,得不到实时处理.因此,不能简单地通过Windows消息引发一个对定时要求

asp.net基于windows服务实现定时发送邮件的方法_实用技巧

本文实例讲述了asp.net基于windows服务实现定时发送邮件的方法.分享给大家供大家参考,具体如下: //定义组件 private System.Timers.Timer time; public int nowhour; public int minutes; public string sendTime; public Thread th; public string isOpen;//是否启用定时发送 public string strToEUser; public static i

VC中加入定时机制的几种方法

定时机制是指在程序运行当中间隔特定的时间引发指定的事件.在DOS下编程时,主要依靠时钟中断Int 8及其调用中断 Int 1cH来实现,应用程序通过修改这些系统中断来达到实现定时触发.而在Windows下,若想象在DOS下肆无忌惮的修改系统是不现实的,那么应当如何实现定时机制呢?下面在下就在学习当中的几点体会谈谈这个问题,提出几种方案供大家参考. 第一种方案是大家熟悉的截获定时消息的途径.在Windows提供给我们使用的系统资源当中,有一种称为"定时器(Timer)"的特殊资源,在申请

windows系统中基于WIFI的网络编程

问题描述 windows系统中基于WIFI的网络编程 想用C++写一个在windows系统中基于WIFI传输数据的网络小程序,请各位高手指点一下,应该从哪方面入手,开发流程是什么样的? 解决方案 什么也不用操心,wifi对于你的程序来说,是透明的,换一句话说,无线有线你的代码无需变化.在windows下,可以使用winsock编程实现通讯,如果是vc++,用mfc,可以用csocket类,具体google下,有现成的代码例子. 解决方案二: 就是winsock2而已不管网络是什么,用这个就对了,

vc++中的基于对话框具体编程代码代码?具体具体,,急求 谢各位大神了

问题描述 vc++中的基于对话框具体编程代码代码?具体具体,,急求 谢各位大神了 vc++中的基于对话框具体编程代码代码?具体具体,,急求 谢各位大神了 解决方案 具体?看你想要什么功能! VC 建立对话框工程后,会自动生成对话框的框架代码.你难道是要想这个? 这样的问题,建议你找本相关的书看看.或者,在网上有很多此方面的帖子的,例如:MFC 之 对话框编程入门(上.中.下) 解决方案二: 新建一个mfc项目,进入向导,选择基于对话框,其余默认,确定,就产生了. 打开资源,找到对话框,往里面画控

怎样在VC++中访问和修改注册表

Windows95/98/Me的注册表包含了Windows95/98/Me的系统配置.PC机的硬件配置.Win32应用程序和用户的其他设置信息.注册表和INI文件不同,它是多层次的树状数据结构,具有六个分支(根键),每个分支又由许多的键和键值组成,而每个键则代表一个特定的配置项目. 在实际编程工作中,我们遇到了如何在Visual C++中对Windows95/98/Me注册表整个树状结构信息进行访问和修改的问题,如查询和修改注册表中用户姓名和公司名称的有关信息.通过编程实践,我们实现了在Visu

如何在VC++中使用API直接打印

(说明:)这一段代码,用以演示<如何在VC++中使用API直接打印>.并且该段代码可以直接嵌入各种工程中,有实际使用的价值. (用途:)在Visual C++中,应用程序通常是使用CView中提供的打印功能,在OnPrint()或OnDraw()中向打印机输出.但是对于对话框中的数据,或基于对话框的程序,打印成了一件繁琐的工作. 该段代码向用户提供了PrintListCtrl()函数,用于打印用户在对话框或FormView中的CListCtrl(控件必须是Report View 形式的)控件中

python基于windows平台锁定键盘输入的方法_python

本文实例讲述了python基于windows平台锁定键盘输入的方法.分享给大家供大家参考.具体分析如下: pywin32中没有BlockInput这个函数.VC++中有,发现这个方法就可以了. 该代码可阻断windows平台下的鼠标键盘输入,如下所示: # coding: UTF-8 import time from ctypes import * user32 = windll.LoadLibrary('user32.dll') user32.BlockInput(True); time.sl

VC++中动态生成菜单技巧

下载源代码 一.前言    在实际运用中,经常需要根据操作来增减菜单和菜单项.在VC++开发环境下,动态生成菜单的方法有多种.例如:可以利用资源编辑器创建菜单资源,然后在程序运行中动态加入菜单,这种动态生成菜单的方法比较常见,运用比较多.用这种方法动态增加菜单时,首先需要在Resource.h中添加菜单ID:由于是动态生成的菜单选项,所以要实现它的功能就不能在ClassWizard中映射函数了,需要在头文件中手动添加消息函数原型,在代码文件中手动添加消息映射和添加消息响应函数.动态生成菜单的另一