七种vc延时方法

上传人:kms****20 文档编号:41051398 上传时间:2018-05-28 格式:DOC 页数:7 大小:31.50KB
返回 下载 相关 举报
七种vc延时方法_第1页
第1页 / 共7页
七种vc延时方法_第2页
第2页 / 共7页
七种vc延时方法_第3页
第3页 / 共7页
七种vc延时方法_第4页
第4页 / 共7页
七种vc延时方法_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《七种vc延时方法》由会员分享,可在线阅读,更多相关《七种vc延时方法(7页珍藏版)》请在金锄头文库上搜索。

1、七种七种 VCVC 延时方法延时方法七种 VC 延时方式 方式一:VC 中的 WM_TIMER 消息映射能进行简单的时间控制。首先调用函数 SetTimer()设置定时间隔,如 SetTimer(0,200,NULL)即为设置 200ms 的时间间隔。然后在应用程序中增加定时响应函数 OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间的操作。这种定时方法非常简单,可以实现一定的定时功能,但其定时功能如同 Sleep()函数的延时功能一样,精度非常低,最小计时精度仅为 30ms,CPU 占用低,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控

2、制环境下的应用。只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。如示例工程中的 Timer1。 方式二:VC 中使用 sleep()函数实现延时,它的单位是 ms,如延时 2 秒,用 sleep(2000)。精度非常低,最小计时精度仅为30ms,用 sleep 函数的不利处在于延时期间不能处理其他的消息,如果时间太长,就好象死机一样,CPU 占用率非常高,只能用于要求不高的延时程序中。如示例工程中的 Timer2。 方式三:利用 COleDateTime 类和 COleDateTimeSpan 类结合WINDOWS 的消息处理过程来实现秒级延时。如示例工程中的 Timer3和 Ti

3、mer3_1。以下是实现 2 秒的延时代码: COleDateTime start_time = COleDateTime:GetCurrentTime(); COleDateTimeSpan end_time= COleDateTime:GetCurrentTime()-start_time; while(end_time.GetTotalSeconds() 方式四:在精度要求较高的情况下,VC 中可以利用GetTickCount()函数,该函数的返回值是 DWORD 型,表示以 ms为单位的计算机启动后经历的时间间隔。精度比 WM_TIMER 消息映射高,在较短的定时中其计时误差为 15m

4、s,在较长的定时中其计时误差较低,如果定时时间太长,就好象死机一样,CPU 占用率非常高,只能用于要求不高的延时程序中。如示例工程中的 Timer4 和Timer4_1。下列代码可以实现 50ms 的精确定时: DWORD dwStart = GetTickCount(); DWORD dwEnd = dwStart; do dwEnd = GetTickCount()-dwStart; while(dwEnd 为使 GetTickCount()函数在延时或定时期间能处理其他的消息,可以把代码改为: DWORD dwStart = GetTickCount(); DWORD dwEnd = d

5、wStart; do MSG msg; GetMessage( TranslateMessage( DispatchMessage( dwEnd = GetTickCount()-dwStart; while(dwEnd 50); 虽然这样可以降低 CPU 的占有率,并在延时或定时期间也能处理其他的消息,但降低了延时或定时精度。 方式五:与 GetTickCount()函数类似的多媒体定时器函数DWORD timeGetTime(void),该函数定时精度为 ms 级,返回从Windows 启动开始经过的毫秒数。微软公司在其多媒体 Windows 中提供了精确定时器的底层 API 持,利用多媒

6、体定时器可以很精确地读出系统的当前时间,并且能在非常精确的时间间隔内完成一个事件、函数或过程的调用。不同之处在于调用 DWORD timeGetTime(void) 函数之前必须将 Winmm.lib 和 Mmsystem.h 添加到工程中,否则在编译时提示 DWORD timeGetTime(void)函数未定义。由于使用该函数是通过查询的方式进行定时控制的,所以,应该建立定时循环来进行定时事件的控制。如示例工程中的 Timer5 和 Timer5_1。 方式六:使用多媒体定时器 timeSetEvent()函数,该函数定时精度为 ms 级。利用该函数可以实现周期性的函数调用。如示例工程中的

7、Timer6 和 Timer6_1。函数的原型如下: MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent ) 该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一旦被激活,便调用指定的回调函数, 成功后返回事件的标识符代码,否则返回 NULL。函数的参数说明如下: uDelay:以毫秒指定事件的周期。 Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为 1ms。 LpTimePr

8、oc:指向一个回调函数。 DwUser:存放用户提供的回调数据。 FuEvent:指定定时器事件类型: TIME_ONESHOT:uDelay 毫秒后只产生一次事件 TIME_PERIODIC :每隔 uDelay 毫秒周期性地产生事件。 具体应用时,可以通过调用 timeSetEvent()函数,将需要周期性执行的任务定义在 LpTimeProc 回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是,任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后,应及时调用timeKillEvent()将之释放。 方式七:对于精确度要求更高的定时操作,则应该使用 Query

9、PerformanceFrequency()和 QueryPerformanceCounter()函数。这两个函数是 VC 提供的仅供 Windows 95 及其后续版本使用的精确时间函数,并要求计算机从硬件上支持精确定时器。如示例工程中的 Timer7、Timer7_1、Timer7_2、 Timer7_3。 QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型如下: BOOL QueryPerformanceFrequency(LARGE_INTEGER lpFrequency); BOOL QueryPerformanc

10、eCounter(LARGE_INTEGER lpCount); 数据类型 ARGE_INTEGER 既可以是一个 8 字节长的整型数,也可以是两个 4 字节长的整型数的联合结构, 其具体用法根据编译器是否支持 64 位而定。该类型的定义如下: typedef union _LARGE_INTEGER struct DWORD LowPart ;/ 4 字节整型数 LONG HighPart;/ 4 字节整型数 ; LONGLONG QuadPart ;/ 8 字节整型数 LARGE_INTEGER ; 在进行定时之前,先调用 QueryPerformanceFrequency()函数获得机器

11、内部定时器的时钟频率,然后在需要严格定时的事件发生之前和发生之后分别调用 QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经 历的精确时间。下列代码实现 1ms 的精确定时: LARGE_INTEGER litmp; LONGLONG QPart1,QPart2; double dfMinus, dfFreq, dfTim; QueryPerformanceFrequency( dfFreq = (double)litmp.QuadPart;/ 获得计数器的时钟频率 QueryPerformanceCounter( QPart1 = litm

12、p.QuadPart;/ 获得初始值 do QueryPerformanceCounter( QPart2 = litmp.QuadPart;/获得中止值 dfMinus = (double)(QPart2-QPart1); dfTim = dfMinus / dfFreq;/ 获得对应的时间值,单位为秒 while(dfTim 0.001); 其定时误差不超过 1 微秒,精度与 CPU 等机器配置有关。 下面的程序用来测试函数 Sleep(100)的精确持续时间: LARGE_INTEGER litmp; LONGLONG QPart1,QPart2; double dfMinus, dfF

13、req, dfTim; QueryPerformanceFrequency( dfFreq = (double)litmp.QuadPart;/ 获得计数器的时钟频率 QueryPerformanceCounter( QPart1 = litmp.QuadPart;/ 获得初始值 Sleep(100); QueryPerformanceCounter( QPart2 = litmp.QuadPart;/获得中止值 dfMinus = (double)(QPart2-QPart1); dfTim = dfMinus / dfFreq;/ 获得对应的时间值,单位为秒 由于 Sleep()函数自身的

14、误差,上述程序每次执行的结果都会有微小误差。下列代码实现 1 微秒的精确定时: LARGE_INTEGER litmp; LONGLONG QPart1,QPart2; double dfMinus, dfFreq, dfTim; QueryPerformanceFrequency( dfFreq = (double)litmp.QuadPart;/ 获得计数器的时钟频率 QueryPerformanceCounter( QPart1 = litmp.QuadPart;/ 获得初始值 do QueryPerformanceCounter( QPart2 = litmp.QuadPart;/获得中止值 dfMinus = (double)(QPart2-QPart1); dfTim = dfMinus / dfFreq;/ 获得对应的时间值,单位为秒 while(dfTim 0.000001); 其定时误差一般不超过 0.5 微秒,精度与 CPU 等机器配置有关。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

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