文档库 最新最全的文档下载
当前位置:文档库 › windows多媒体定时器例程—C语言篇

windows多媒体定时器例程—C语言篇

windows多媒体定时器例程—C语言篇
windows多媒体定时器例程—C语言篇

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的指针

相关文档