MFC定时器使用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5)在OnTimer中增加代码显示Cal的值。 void CTimerSampleDlg::OnTimer(UINT nIDEvent)
{
m_Edit1=m_Edit1+1; m_Edit2=m_Cal;//添加的代码
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent); }
返回
使用QueryPerformanceFrequency()和
QueryPerformanceCounter()函数进行精确定时的步骤如下:
1、首先调用QueryPerformanceFrequency()函数取得高精 度运行计数器的频率f,单位是每秒多少次(n/s),此数一般很 大; 2、在需要定时的代码的两端分别调用 QueryPerformanceCounter()以取得高精度运行计数器的数值n1、 n2,两次数值的差值通过f换算成时间间隔,t=(n2-n1)/f,当t大 于或等于定时时间长度时,启动定时器;
返回
2、使用WM_TIMER消息需要用到的函数 1) SetTimer()
功能:设置定时间隔并启动定时器。
函数原型:UINT SetTimer(UINT nIDEvent,UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)); 参数说明: nIDEvent:非0值标识Timer的id 。 nElapse:以毫秒为单位的定时间隔时间 lpfnTimer 指向定时事件到达时调用的函数的指针,如果为NULL,那么 调用OnTimer() 例:SetTimer(1,200,NULL)设置并启动一个时间间隔为200ms的定时器。
TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。
返回
2、使用举例 程序功能:实现窗口内数字每隔100毫秒自动加1。 1)在TimerSample程序的主窗口上增加一个编辑控件
返回
2)在对话框的头文件中定义代码
class CTimerSampleDlg : public CDialog
返回
4.1
3、使用QueryPerformanceFrequency()和QueryPerformanceCounter
()函数
对于更精确的定时操作,使用QueryPerformanceFrequency()和 QueryPerformanceCounter()函数。这两个函数是Visual C++提供并
void CTimerSampleDlg::OnButtonstarttimer() { TimerID = timeSetEvent(100, 1, LPTIMECALLBACK)TimeProc, 0,TIME_PERIODIC); //新加代码
SetTimer(1,100,NULL);//原来代码
返回
步骤3 添加WM_TIMER的消息响应函数(略)
步骤4 添加定时器消息响应代码。 void CTimerSampleDlg::OnTimer(UINT nIDEvent) {
m_Edit1=m_Edit1+1;
UpdateData(FALSE);//将变量的值送给控件显示。 CDialog::OnTimer(nIDEvent);
第3章 定时器的应用
返回
目录

3.1 概述

3.2 定时器的使用方法

3.3 其它定时方法概述
4.1 3.1 概述
在计算机程序设计领域,有很多功能是周期性执行的, 如:数据采集程序,系统时间的显示等。 数据采集:周期性地获得现场的物理量信息
系统时间的显示:周期性地获得系统时间,并显示出来。
完成上述这些功能的代码都是按照一定的时间间隔周期性地执行 的,这是就需要用到一个新的组件——定时器(TIMER)。 定时器是Windows系统的资源, Visual C++提供了定时器消息和一 些与定时相关的函数。使用这些函数可以完成程序代码的周期性执行。
返回
3.2.3 多媒体定时器 1、 针对前两种定时器的缺点,MicroSoft公司提供了一种精度更高的 定时器——多媒体定时器。 优点: (1)精度较高:多媒体定时器最小误差为1毫秒。 (2)优先级较高,可以减轻资源紧张对定时器运行的影响。
返回
2、多媒体定时器的使用
timeSetEvent 函数
返回
程序运行结果
4.1
返回
4.1
3.3 其它定时方法
1、使用GetTickCount函数 2、使用QueryPerformanceFrequency()和QueryPerformanceCounter ()函数。 在精度要求较高的情况下,如要求定时误差不大于1ms时,还可以利 用GetTickCount()函数返回自计算机启动后的时间,该函数的返回值 是DWORD型,表示以ms为单位的计算机启动后经历的时间间隔。通过两次 调用GetTickCount()函数,然后控制它们的差值来取得定时效果。.下 列的代码可以实现50ms的精确定时,其误差是毫秒级的。
}
返回
步骤5、增加启动和停止定时器的消息响应函数。 void CTimerSampleDlg::OnButtonkilltimer() {
KillTimer(1);
} void CTimerSampleDlg::OnButtonstarttimer() {
SetTimer(1,100,NULL);
1、生成应用程序框架(基于对话框TimerSample)。 2、编辑对话框资源。
3、添加定时器消息响应函数。
4、添加定时器消息响应代码。 5、增加启动和停止定时器的按钮消息响应函数。
返回
4.1
步骤1 生成应用程序框架 选择基于对话框的程序,名称为TimerSample。 步骤2:编辑对话框资源。在对话框上增加一个编辑框和两个按钮, 控件属性如下: Caption ---------启动定时器 停止定时器 ID IDC_EDIT1 IDC_BUTTONSTARTTIMER IDC_BUTTONKILLTIMER 关联变量 m_Edit1
i=i+1; //此处添加需要周期性执行的代码。
Sleep(1000); } Sleep函数:延时函数 参数:延时的时间(单位ms)
返回
Sleep函数分析 优点: (1)使用简单。 (2)移植方便。
缺点:
(1)CPU占用率高,一般适用于单任务的程序(如DOS操作系统的程序)
(2)程序能够完成wk.baidu.com功能比较简单。 (3)定时精度低,(据资料)最小误差为54.915 ms,每秒18.2次。
1、WM_TIMER的功能: (1)可以完成定时操作。
(2)定时任务执行完毕后,将控制权交回给程序。程序可以进行其它
的操作。
返回
WM_TIMER方式定时的工作原理
应用程序启动定时器
系统监控到定时时间到
应用程序响应其他 消息或执行其它的 操作
应用程序触发WM_TIMER消息
应用程序响应WM_TIMER消息 (即执行WM_TIMER相应的响应函数)
返回
4.1
3.2.2 WM_TIMER
众所周知,Windows系统是一个多任务的操作系统。即可以有多个任 务并行,这时,周期性(定时)执行的任务在执行完毕后,应该将控制 权交给系统,这样程序的其它功能才能得以执行。 Windows系统提供了WM_TIMER消息来实现多任务系统的定时操作。
WM_TIMER是一个Windosws的窗口消息
}
返回
程序运行效果
WM_TIMER的缺点:
1、精度低,最小计时精度大约为55ms(Win95),或10ms左右(Win2000/xp) 2、定时器消息在多任务操作系统中的优先级较低,有时不能得到及 时响应。(一旦计算机的CPU被某个进程占用,或系统资源紧张时, 发送到消息队列中的消息就暂时被挂起,WM_TIMER消息得不到及时处 理。)
返回
3.2 定时器的使用方法
3.2.1 Sleep函数
3.2.2 WM_TIMER消息 3.2.3 多媒体定时器
返回
Viusal C++提供了三种完成周期性操作的方法: 1、Sleep函数(延时函数)。 2、WM_TIMER消息(Windows窗口消息)。 3、多媒体定时器。
返回
3.2.1 Sleep函数 while(1) {
返回
{
……. static void CALLBACK TimeProc(UINT uID,UINT uMsg,
DWORD dwUser,DWORD dw1,DWORD dw2); // 定时器回调函数
int TimerID; // 定时器ID …….
};
注意:使用多媒体定时器必须指明回调函数。
返回
3)在OnButtonstarttimer添加启动多媒体定时器的语句
定时器使用总结:
1、在WM_CREATE消息中启动定时器(SetTimer) 2、在WM_TIMER消息中编写定时函数(即需要周期性完成的工作)
3、在定时工作完成之后关闭/停止定时器。(可选)
返回
4.1
3、程序示例
程序设计目标:设计一个定时器程序,窗口内显示的数字每隔100毫秒 自动加1。
程序设计步骤:
}
返回
4)编写回调函数代码 void CALLBACK CTimerSampleDlg::TimeProc(UINT uID,UINT uMsg,
DWORD dwUser,DWORD dw1,DWORD dw2)
{ m_Cal=m_Cal+1;
}
回调函数参数说明: uID——定时器标识,其值和TimerID一致。 uMsg,dw1,dw2保留参数,目前不起作用 dWUser——存放用户的回调数据。
返回
MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent )
参数说明:
uDelay:以毫秒指定时的周期 Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越 高。缺省值为1ms。 LpTimeProc:指向一个回调函数,该回调函数包含需要定时执行的代码。 DwUser:存放用户提供的回调数据。 FuEvent:指定定时器事件类型: TIME_ONESHOT:uDelay毫秒后只产生一次事件。
功能:设置并启动一个多媒体定时器。
函数原型: MMRESULT timeSetEvent( UINT uDelay, UINT uResolution,
LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent )
函数头文件:#include "mmsystem.h"
消息响应函数为OnTimer()
返回
例:SetTimer(2,1000, TimerProc );设置并启动一个实间间隔为1s的
定时器,该定时器的响应函数为TimerProc。
2)KillTimer(1)
功能:取消定时器,此函数调用后,相应的定时器将被关闭不再起作用。 参数:用SetTimer()函数创建的定时器标识。
且仅供Windows 95及其后续版本使用,其精度与CPU的时钟频率有关,
它们要求计算机从硬件上支持精确定时器。 QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数
的原型如下:
BOOL QueryPerformanceFrequency (LARGE_INTEGER *lpFrequency); BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
相关文档
最新文档