Windows定时器

上传人:德****1 文档编号:1091420 上传时间:2017-05-27 格式:PPT 页数:9 大小:251KB
返回 下载 相关 举报
Windows定时器_第1页
第1页 / 共9页
Windows定时器_第2页
第2页 / 共9页
Windows定时器_第3页
第3页 / 共9页
Windows定时器_第4页
第4页 / 共9页
Windows定时器_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《Windows定时器》由会员分享,可在线阅读,更多相关《Windows定时器(9页珍藏版)》请在金锄头文库上搜索。

1、三、定时器,定时器在接口技术中经常用到。例如: 在串行通信中,每隔一定的时间,查询是否收到数据; 在视频播放中,每隔一定的时间播放一帧图像,等。 在Windows系统下,定时功能的实现,一般不直接操作8253芯片,而是使用系统提供的定时器函数。 Windows系统提供了几种定时器函数,主要为: 系统定时器 (Timer),精度低; 多媒体 定时器 (Multimedia Timer),精度中; 以计数器频率为基准的计数器查询(QueryCounter),精度高。 本节主要讨论多媒体定时器的编程方法。,1、系统定时器 基于8253定时器通道0的55ms定时间隔设计,因此,定时精度为55ms,且优

2、先级低。编程步骤: (1)建立系统定时器。函数原型为:,UINT :SetTimer(HWND hWnd, /接收时间消息的窗口句柄 UINT nIDEvent, / 本定时器的ID,不能为 0 UINT uElapse, / 时间到达值,毫秒 TIMERPROC lpTimerFunc / 指向消息响应函数);,接收消息的窗口为本程序关联的窗口类,消息响应函数应设置为接收系统消息 WM_TIMER。 注意: 一个应用程序最多只能建立32个定时器。,UINT CWnd:SetTimer(UINT nIDEvent, / 本定时器的ID,不能为0 UINT nElapse / 时间到达值,毫秒

3、);,(2)建立定时消息响应函数。,void CALLBACK TimerProc ( HWND hWnd, / 调用SetTimer( )的窗口句柄 UINT uMsg, / WM_TIMER 消息 UINT nIDEvent / 定时器ID DWORD dwTime / 系统当前时间 );,前一种形式,可采用MFC ClassWizard 建立定时消息响应函数OnTimer()。,后一种形式,应编写响应 WM_TIMER 消息的回调函数:,注意:此回调函数为全局函数,不应写在一个类里面。,(3)用毕,删除定时器: BOOL KillTimer( int nIDEvent ); /参数为定时

4、器ID,2、多媒体定时器 定时精度为1ms,优先级高。用于对实时性要求较高的场合,如影音播放等。,在应用程序中,多媒体定时器以如下方式运行:,(1)在工程中隐式连接系统的多媒体 DLL: 在工程中包含头文件: #include “mmsystem.h” 选 Project /settings,按如下操作设定:,多媒体定时器用DLL形式提供,使用步骤如下:,(2) 获得多媒体定时器的最大定时分辨率,函数原型如下:,MMRESULT timeGetDevCaps(LPTIMECAPS ptc, /指向 TIMECAPS结构 UINT cbtc /TIMECAPS结构的大小 ); TIMECAPS结

5、构的定义为: typedef struct UINT wPeriodMin; /定时器的最小分辨率 UINT wPeriodMax; /定时器的最大分辨率 TIMECAPS;,得到 最大、最小分辨率后,决定你打算采用的分辨率。注意,你打算采用的分辨率必须在最大、最小分辨率之间。即:,wPeriodMin 你打算采用的分辨率 wPeriodMax,再为程序设置你的分辨率: MMRESULT timeBeginPeriod( UINT uPeriod ); /参数为你的分辨率,(3)设置“定时时间到”事件的触发方式,MMRESULT timeSetEvent( UINT uDelay, /时间间隔

6、,毫秒 UINT uResolution, /分辨率 LPTIMECALLBACK lpTimeProc, /指向消息响应函数 DWORD dwUser, /调用函数提供的回调参数 UINT fuEvent /事件类型,为 TIME_ONESHOT或 TIME_PERIODIC ); 注: TIME_ONESHOT为单次触发,TIME_PERIODIC为周期性触发。,(4)编写全局回调函数(全局) ,原型为:,void CALLBACK TimeProc( UINT uID, /定时事件的ID UINT uMsg, /系统保留,不要使用 DWORD dwUser, /用户调用参数,由timeS

7、etEvent( )提供 DWORD dw1, /系统保留,不要使用 DWORD dw2 , /系统保留,不要使用 );,(5)定义用户消息,由回调函数发送,让用户函数响应,定义用户消息(全局): #define MYMSG WM_USER+101 注:MYMSG是自定义消息的ID,可自由命名; WM_USER在系统中代表整数400,必须照写; Microsoft推荐用户自定义消息的ID号至少是500,小于这个值的消息可能被系统占用。,在工程的有关h文件中,声明用户消息响应函数: afx_msg void MyTimer(WPARAM wParam, LPARAM lParam);,在工程的相

8、应cpp文件中,写出用户消息与响应函数的影射关系: BEGIN_MESSAGE_MAP(CSocktDlg, CDialog)/AFX_MSG_MAP(CSocktDlg)ON_MESSAGE(MYMSG, MyTimer)/AFX_MSG_MAP END_MESSAGE_MAP(),(6)消息的发送与响应,在工程的相应cpp文件中,写出定义用户消息响应函数体void MyTimer(WPARAM wParam, LPARAM lParam) /收到消息后要做的工作 ,在工程的相应cpp文件中,写出回调函数体(全局) ,发送用户消息void CALLBACK TimeProc(UINT uID

9、, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2 , ) pWnd-PostMessage(MYMSG); /发送消息 ,其中,发送消息的函数原型为:BOOL PostMessage( UINT message, /消息 WPARAM wParam = 0, /附加参数 LPARAM lParam = 0 /附加参数 );,(5)用毕,删除定时器,删除定时器分辨率 MMRESULT timeEndPeriod( UINT uPeriod ); /参数为分辨率,删除定时器句柄 MMRESULT timeKillEvent( UINT uTimerID

10、 ); /参数为定时器句柄,多媒体定时器应用举例 设计程序,模拟汽车运行。,3、以计数器工作频率为基准的计数器查询定时方式。在目前的PC机中,新加了64位计数功能,其工作时钟一般为 3.579545MHz。,LARGE_INTEGER T; /64 bit整型数LONGLONG t1,t2;double Fq, Timer;QueryPerformanceFrequency(&T) ; /获得计数器的时钟频率,Hz Fq = (double)T.QuadPart;QueryPerformanceCounter(&T); /获得t1时刻的计数值t1 = T.QuadPart; QueryPerformanceCounter(&T); /获得t2时刻的计数值t2 = T.QuadPart;Timer=1000*(double)(t2 - t1)/Fq; /计算时间间隔,换算成毫秒,该计数器的当前计数值可随时读取,用于测量两个时刻之间经历的时间间隔,精度达到微秒级(10-9秒)。,typedef union _LARGE_INTEGER struct DWORD LowPart; LONG HighPart; ; LONGLONG QuadPart; LARGE_INTEGER, *PLARGE_INTEGER;,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号