以下是一个完整的多媒体定时器设计示例程序,该定时器的精度为1毫秒。<br>程序清单如下:<br>#include < vcl.h ><br>#pragma hdrstop<br>#include "mmsystem.h" //包含多媒体定时器函数的头文件<br>#define MilliSecond 1 //定时间隔1毫秒<br>#define Accuracy 1 //系统允许的分辨率最小值<br>#define Min(x,y) ((x < y) ? x : y)<br>#define Max(x,y) ((x > y) ? x : y)<br>#include "HighTimerU.h"<br>//------------------------------------------------<br>#pragma package(smart_init)<br>#pragma resource "*.dfm"<br>UINT TimerID; //定义定时器句柄<br>int count; //定义一个变量以进行计数<br>int TimerAccuracy;<br>TForm1 *Form1;<br>//------------------------------------------------<br>__fastcall TForm1::TForm1(TComponent* Owner)<br>: TForm(Owner)<br>{<br>}<br>void PASCAL TimerCallProc(UINT TimerID, UINT msg,DWORD dwUser,DWORD dwa,DWORD dwb) <br>//定义定时器事件的调用函数<br>{<br>count++;<br>Form1- >Edit1->Text=count; <br>//在一个编辑框内显示计数值,即定时值<br>}<br><br>//---------------------------------------------------<br>void __fastcall TForm1::Button1Click(TObject *Sender)<br>{<br>TIMECAPS timecaps;<br>int TimerResolution;<br><br>//从系统获得关于定时器服务能力的信息,<br>//分辨率不能超出系统许可值(1到16毫秒)<br>if (timeGetDevCaps(&timecaps,sizeof(<br> TIMECAPS))==TIMERR_NOERROR)<br>TimerAccuracy=Min(Max(timecaps.wPeriodMin,<br> Accuracy),timecaps.wPeriodMax);<br><br>timeBeginPeriod(TimerAccuracy); <br>//设置定时器分辨率<br><br>TimerResolution=1; //设置定时间隔为1毫秒<br><br>//产生间隔1毫秒,周期执行的定时器事件;启动定时器<br>TimerID = timeSetEvent(TimerResolution,TimerAccuracy,<br>&TimerCallProc,1,TIME_PERIODIC);<br>}<br>//-------------------------------------------------------<br>void __fastcall TForm1::Button2Click(TObject *Sender)<br>{<br>timeKillEvent(TimerID); //删除定时器事件<br>timeEndPeriod(TimerAccuracy); //清除定时器分辨率<br>}<br> 多媒体定时器对实现高精度定时是很理想的工具,而且其精度是十分可靠的。<br>但是,因为它可靠的精度是建立在对系统资源的消耗之上的。因此必须注意以下几点:<br>1. 多媒体定时器的设置分辨率不能超出系统许可范围。<br>2. 在使用完定时器以后,一定要及时删除定时器及其分辨率,否则系统会越来越慢。<br>3. 多媒体定时器在启动时,将自动开辟一个独立的线程。在定时器线程结束之前,注<br>意一定不能再次启动该定时器,不然将迅速造成死机。<br> 另外,回调函数必须定义成全局函数或类的静态函数。。。切记,切记!!!