VC高精度多媒体定时器的使用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
timeGetSystemTime, timeGetTime, timeSetEvent,timeKillEvent ,midiOutShortMsg, midiOutLongMsg,OutputDebugString。同时也不要使用完成时间很
长的 API 函数,程序尽可能简短。
使用以上一组函数就可以完成毫秒级精度的计时和控制(在 C++Builder 中使用时要将 头文件 mmsystem.h 加到程序中)。由于将定时控
该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一 旦被激活,便调用指定的回调函数,成功后返回事件的标识符代码,否则返回 NULL。参数 说明如下:
uDelay:以毫秒指定事件的周期。 UResolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为 1ms。 LpTimeProc:指向一个回调函数。 DwUser:存放用户提供的回调数据。 FuEvent:指定定时器事件类型: TIME_ONESHOT:uDelay 毫秒后只产生一次事件 TIME_PERIODIC :每隔 uDelay 毫秒周期性地产生事件。
22 g_wTimerID = timeSetEvent(6, wTimerRes, (LPTIMECALLBACK)SendFun, (DWORD )this, TIME_PERIODIC);
23 if(g_wTimerID == 0)
24
return false;
25
26 return true;
/******************************************************************\ function name : CreateTimer desc : create a realtime timer argument void ret code [HANDLE] ,the handle of the timer
CMyTimer* pThis = (CMyTimer*)dwUser;
}
使用多媒体定时器 timeSetEvent()函数,该函数定时精度为 ms 级。利用该函数可以实现周期 性的函数调用。函数的原型如下:
MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent )
\******************************************************************/
void CALLBACK CMyTimer::TimerHandler(UINT id, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2) {
\******************************************************************/ void CMyTimer::DestroyTimer() {
if ( bRun ) {
timeKillEvent(timerID); timeEndPeriod(timeRes); bRun = FALSE; }
27 }
28 29 //删除定时器
30 void CDsisiiDlg::DestroyTimer()
31
பைடு நூலகம்
{
32 if (g_wTimerID)
33
{
34
timeKillEvent(g_wTimerID);
35
g_wTimerID = 0;
36 }
37 }
vc 高精度多媒体定时器的使用方法
在 VC 编程中,用 SetTimer 可以定义一个定时器,到时间了,就响应 OnTimer 消息,但这 种定时器精度太低了。如果需要精度更高一些的定时器(精确到 1ms),可以使用下面的高 精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便。先要包含头文件 "mmsystem.h"和库文件"winmm.lib"。
4.回调函数 void CALLBACK UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
TimeProc(
该函数是一个应用程序定义的回调函数,出现定时器事件时该函数被调用。TimeProc
是应用程序定义的函数名的占位符。使用该函数 时 要 注 意 的 是 , 它 只 能 调 用 以 下 有 限 的 几 组 API 函 数 : PostMessage ,
\******************************************************************/ UINT CMyTimer::CreateTimer() {
//create the timer // Create a periodic timer timeBeginPeriod(timeRes); timerID = timeSetEvent(
制精确到几毫秒,定时器事件将占用大量的 CPU 时间和系统资源,所以在满足控制要求 的前提下,应尽量将参数 uResolution 的数值增大。而
且定时器实时控制功能完成后要尽快释放。
注意以下几点问题: 一、回调函数的参数不能有误,否则可能引起程序崩掉; 二、事件调用周期 uDelay 不能小于事件处理时间,否则会引起程序崩溃; 三、通过 dwUser 给回调函数传递参数
CreateTimer : create a Multimedia timer DestroyTimer: destroy a Multimedia timer
TimerHandler: the actual timer handler procedure \******************************************************************/
虽然 Win95 下可视化开发工具如 VC、Delphi、C++ Builder 等都有专用的定时器控件 Timer,而且使用很方便,可以实现一定的定时功能,但最小计时精度仅为 55ms,且定时器 消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下 的应用。不过 Microsoft 公司在 Win32 API 函数库中已经为用户提供了一组用于高精度计 时的底层函数,如果用户使用得当,计时精度可到 1ms。这个计时精度、对于一般的实时系 统控制完全可以满足要求。现将由 C++ Builder 4.0 提供的重新封装后的一组与时间相 关的主要接口函数(函数名、参数、功能与 Win32 API 基本相同)说明如下:
1.DWORD timeGetTime(void) 返回从 Windows 启动开始经过的毫秒数。最大值为 232,约 49.71 天。
2.MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD dwUser, UINT fuEvent)
例程如下: 1 MMRESULT g_wTimerID = 0;
//回调函数,参数不能有错 2 void CALLBACK CDsisiiDlg::SendFun(UINT wTimerID, UINT msg, DWORD dwUser, DWOR D dwl, DWORD dw2)
3
{
CDsisiiDlg* pdcpackerdlg = (CDsisiiDlg*)dwUser; ... 4} 5 6 bool CDsisiiDlg::CreateTimer()
7
{
8 TIMECAPS tc;
9 UINT wTimerRes;
10 11 //设置多媒体定时器 12 if(timeGetDevCaps(&tc,sizeof(TIMECAPS))!=TIMERR_NOERROR)//向机器申请一个 多媒体定时器
13
return false;
14 15 //获得机器允许的时间间隔(一般可达到 1 毫秒)
vc 高精度多媒体定时器的使用方法如下:
复制内容到剪贴板
程序代码
#include "mmsystem.h" //head file #pragma comment(lib,"winmm") //lib file
const int timePeriod = 2; const int timeRes = 1 ; /*******************MMTimer fuction********************************\
3.MMRESULT timeKillEvent(UINT uTimerID) 该函数取消一个指定的定时器回调事件。uTimerID 标识要取消的事件(由 timeSetEvent
函数返回的标识符)。如果成功则返回 TIMERR_NOERROR,如果定时器时间不存在则返回 MMSYSERR_INVALPARAM。
16 wTimerRes=min(max(tc.wPeriodMin,1),tc.wPeriodMax); 17
18 //定时器开始工作
19 timeBeginPeriod(wTimerRes);
20 21 //每过 6 毫秒调用回调函数 timerback(),wTimerID 为定时器 ID.TIME_PERIODIC 表周 期性调用,TIME_ONESHOT 表只产生一次事件
}
/******************************************************************\ function name : TimerHandler desc : timer procedure called when the the timer signaled argument dwUser,[in],user para data ret code void
该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一旦被 激活,便调用指定的回调函数, 成功后返回事件的标识符代码,否则返回 NULL。函数的 参数说明如下:
uDelay:以毫秒指定事件的周期。 Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为 1ms。 LpTimeProc:指向一个回调函数。 DwUser:存放用户提供的回调数据。 FuEvent:指定定时器事件类型: TIME_ONESHOT:uDelay 毫秒后只产生一次事件 TIME_PERIODIC :每隔 uDelay 毫秒周期性地产生事件。
timePeriod, timeRes, TimerHandler, (DWORD)this, TIME_PERIODIC); return timerID; }
/******************************************************************\ function name : DestroyTimer desc : destroy the timer created by calling CreateTimer argument void ret code void
长的 API 函数,程序尽可能简短。
使用以上一组函数就可以完成毫秒级精度的计时和控制(在 C++Builder 中使用时要将 头文件 mmsystem.h 加到程序中)。由于将定时控
该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一 旦被激活,便调用指定的回调函数,成功后返回事件的标识符代码,否则返回 NULL。参数 说明如下:
uDelay:以毫秒指定事件的周期。 UResolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为 1ms。 LpTimeProc:指向一个回调函数。 DwUser:存放用户提供的回调数据。 FuEvent:指定定时器事件类型: TIME_ONESHOT:uDelay 毫秒后只产生一次事件 TIME_PERIODIC :每隔 uDelay 毫秒周期性地产生事件。
22 g_wTimerID = timeSetEvent(6, wTimerRes, (LPTIMECALLBACK)SendFun, (DWORD )this, TIME_PERIODIC);
23 if(g_wTimerID == 0)
24
return false;
25
26 return true;
/******************************************************************\ function name : CreateTimer desc : create a realtime timer argument void ret code [HANDLE] ,the handle of the timer
CMyTimer* pThis = (CMyTimer*)dwUser;
}
使用多媒体定时器 timeSetEvent()函数,该函数定时精度为 ms 级。利用该函数可以实现周期 性的函数调用。函数的原型如下:
MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent )
\******************************************************************/
void CALLBACK CMyTimer::TimerHandler(UINT id, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2) {
\******************************************************************/ void CMyTimer::DestroyTimer() {
if ( bRun ) {
timeKillEvent(timerID); timeEndPeriod(timeRes); bRun = FALSE; }
27 }
28 29 //删除定时器
30 void CDsisiiDlg::DestroyTimer()
31
பைடு நூலகம்
{
32 if (g_wTimerID)
33
{
34
timeKillEvent(g_wTimerID);
35
g_wTimerID = 0;
36 }
37 }
vc 高精度多媒体定时器的使用方法
在 VC 编程中,用 SetTimer 可以定义一个定时器,到时间了,就响应 OnTimer 消息,但这 种定时器精度太低了。如果需要精度更高一些的定时器(精确到 1ms),可以使用下面的高 精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便。先要包含头文件 "mmsystem.h"和库文件"winmm.lib"。
4.回调函数 void CALLBACK UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
TimeProc(
该函数是一个应用程序定义的回调函数,出现定时器事件时该函数被调用。TimeProc
是应用程序定义的函数名的占位符。使用该函数 时 要 注 意 的 是 , 它 只 能 调 用 以 下 有 限 的 几 组 API 函 数 : PostMessage ,
\******************************************************************/ UINT CMyTimer::CreateTimer() {
//create the timer // Create a periodic timer timeBeginPeriod(timeRes); timerID = timeSetEvent(
制精确到几毫秒,定时器事件将占用大量的 CPU 时间和系统资源,所以在满足控制要求 的前提下,应尽量将参数 uResolution 的数值增大。而
且定时器实时控制功能完成后要尽快释放。
注意以下几点问题: 一、回调函数的参数不能有误,否则可能引起程序崩掉; 二、事件调用周期 uDelay 不能小于事件处理时间,否则会引起程序崩溃; 三、通过 dwUser 给回调函数传递参数
CreateTimer : create a Multimedia timer DestroyTimer: destroy a Multimedia timer
TimerHandler: the actual timer handler procedure \******************************************************************/
虽然 Win95 下可视化开发工具如 VC、Delphi、C++ Builder 等都有专用的定时器控件 Timer,而且使用很方便,可以实现一定的定时功能,但最小计时精度仅为 55ms,且定时器 消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下 的应用。不过 Microsoft 公司在 Win32 API 函数库中已经为用户提供了一组用于高精度计 时的底层函数,如果用户使用得当,计时精度可到 1ms。这个计时精度、对于一般的实时系 统控制完全可以满足要求。现将由 C++ Builder 4.0 提供的重新封装后的一组与时间相 关的主要接口函数(函数名、参数、功能与 Win32 API 基本相同)说明如下:
1.DWORD timeGetTime(void) 返回从 Windows 启动开始经过的毫秒数。最大值为 232,约 49.71 天。
2.MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD dwUser, UINT fuEvent)
例程如下: 1 MMRESULT g_wTimerID = 0;
//回调函数,参数不能有错 2 void CALLBACK CDsisiiDlg::SendFun(UINT wTimerID, UINT msg, DWORD dwUser, DWOR D dwl, DWORD dw2)
3
{
CDsisiiDlg* pdcpackerdlg = (CDsisiiDlg*)dwUser; ... 4} 5 6 bool CDsisiiDlg::CreateTimer()
7
{
8 TIMECAPS tc;
9 UINT wTimerRes;
10 11 //设置多媒体定时器 12 if(timeGetDevCaps(&tc,sizeof(TIMECAPS))!=TIMERR_NOERROR)//向机器申请一个 多媒体定时器
13
return false;
14 15 //获得机器允许的时间间隔(一般可达到 1 毫秒)
vc 高精度多媒体定时器的使用方法如下:
复制内容到剪贴板
程序代码
#include "mmsystem.h" //head file #pragma comment(lib,"winmm") //lib file
const int timePeriod = 2; const int timeRes = 1 ; /*******************MMTimer fuction********************************\
3.MMRESULT timeKillEvent(UINT uTimerID) 该函数取消一个指定的定时器回调事件。uTimerID 标识要取消的事件(由 timeSetEvent
函数返回的标识符)。如果成功则返回 TIMERR_NOERROR,如果定时器时间不存在则返回 MMSYSERR_INVALPARAM。
16 wTimerRes=min(max(tc.wPeriodMin,1),tc.wPeriodMax); 17
18 //定时器开始工作
19 timeBeginPeriod(wTimerRes);
20 21 //每过 6 毫秒调用回调函数 timerback(),wTimerID 为定时器 ID.TIME_PERIODIC 表周 期性调用,TIME_ONESHOT 表只产生一次事件
}
/******************************************************************\ function name : TimerHandler desc : timer procedure called when the the timer signaled argument dwUser,[in],user para data ret code void
该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一旦被 激活,便调用指定的回调函数, 成功后返回事件的标识符代码,否则返回 NULL。函数的 参数说明如下:
uDelay:以毫秒指定事件的周期。 Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为 1ms。 LpTimeProc:指向一个回调函数。 DwUser:存放用户提供的回调数据。 FuEvent:指定定时器事件类型: TIME_ONESHOT:uDelay 毫秒后只产生一次事件 TIME_PERIODIC :每隔 uDelay 毫秒周期性地产生事件。
timePeriod, timeRes, TimerHandler, (DWORD)this, TIME_PERIODIC); return timerID; }
/******************************************************************\ function name : DestroyTimer desc : destroy the timer created by calling CreateTimer argument void ret code void