windows多媒体定时器例程—C语言篇
其实网上有不少关于多媒体定时器应用的文章和例子,只不过这些程序一方面都是用C++编的,另一方面没有一个能完全正确运行的。没办法,只好自己编。经过一番周折,总算得一个能正常运行的例子。下面就是这个例子的C代码:
#include
#include
#pragma comment(lib,"winmm.lib" //安装多媒体定时器支持库,也可手动将winmm.lib添加到工程中。
#define TIMER_ACCURACY 1000 //定时器分辨率
#define N 5
void CALLBACK fun(UINT uID,UINT uMsg,DWORD dwUser,DWORD dw1,DW ORD dw2)
{
printf("The timer event callback!\n" ;
printf("Current time:%lu\n",GetTickCount());
}
void main()
{
UINT wTimerRes=TIMER_ACCURACY; //定义时间间隔
UINT wAccuracy; //定义分辨率
UINT TimerID; //定义定时器句柄
TIMECAPS tc;
if(timeGetDevCaps(&tc,sizeof(TIMECAPS))==TIMERR_NOERROR)
{
wAccuracy=min(max(tc.wPeriodMin,TIMER_ACCURACY),tc.wPeriodMax); //判断分辨率是否在允许范围
timeBeginPeriod(wAccuracy); //设置定时器分辨率
}
//设置定时器回调事件,回调函数形如fun
if((TimerID=timeSetEvent(wTimerRes,wAccuracy,(LPTIMECALLBACK)fun,0,TI ME_PERIODIC))==0)
{
printf("Can't count!\n" ;
}
Sleep(N*TIMER_ACCURACY); //等待定时器线程执行N*TIMER_ACCURACY ms
timeKillEvent(TimerID);
timeEndPeriod(wAccuracy);
}
执行结果:
The timer event callback!
Current time:1091421
The timer event callback!
Current time:1092421
The timer event callback!
Current time:1093421
The timer event callback!
Current time:1094421
The timer event callback!
Current time:1095421
Press any key to continue
从上面的结果可以看出,回调函数的执行间隔不多不少恰好为1000ms等于定时器当前分辨率。
在应用多媒体定时器的时候应注意几个问题:
1、多媒体定时器库文件
如果没有将多媒体定时器的支持库文件(winmm.lib)添加到工程中,链接时将会出错.
2、mmsystem.h
在编译控制台程序的时候,包含这个头文件将会发生编译错误,错误显示为mmsystem.h的语法错误。mmsystem.h应该没有什么问题,问题出在它可能不能用在这类应用程序中。如果用windows.h代替就可解决问题。
3、InitializeTimer()
网上有个例子用到这个函数来初始化定时器,在window95+vc5.0下做的,我在winXP+vc6.0下做是通不过编译的,原因是无法识别的外部函数。我在MSDN 中也找不到这个函数的声明。不用这个函数,程序也能正常运行。
那就得看调用回调函数的人的想法了。
例子:
A提供回调函数F,B调用回调函数,B想让C处理回调函数里的数据,则在dwUser参数里传入C的指针