足球比分直播

定时器85010.doc

返回
定时器85010.doc_第1页
第1页 / 共13页
定时器85010.doc_第2页
第2页 / 共13页
定时器85010.doc_第3页
第3页 / 共13页
定时器85010.doc_第4页
第4页 / 共13页
定时器85010.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述:
VC 定时器 在 VC 中,定时有三种方法,一是利用 WM_TIMER 消息的 API 函数,二是使用多媒体定时器,三是多线程定时器(不知道是不是可以这样分啊)。1、WM_TIMERSetTimer 函数是用来设立一个定时器,SetTimer 函数的原型如下UINT_PTR SetTimerHWND hWnd, // 窗口句柄UINT_PTR nIDEvent, // 定时器 IDUINT uElapse, // 时间间隔,单位为毫秒TIMERPROC lpTimerFunc // 回调函数;第一个参数是窗口句柄,在 MFC 中,SetTimer 函数被封装在 CWnd 类中,调用时不用指出窗口句柄;第二个参数是定时器 ID,在启用多个定时器时,用来标识各个不同的定时器,在不使用 MFC 的情况下,当接收到 WM_TIMER 消息时,WPARAM wParam 就是这个 ID(API的东西,都忘得差不多了,-_- );第三个参数为时间间隔,也就是回调函数的调用周期,单位是毫秒;第四个参数是回调函数,当设为 NULL 时,调用系统默认的回调函数。这个默认的回调函数是 OnTimer,可以在需要定时器的类中添加,添加时只要在 ClassWizard 里添加WM_TIMER 的消息映射就可以了。函数的返回值为定时器 ID。这个函数的使用有点像定时器中断,SetTimer 就是开中断,回调函数就是中断子程,既然有开中断就一定要有关中断,在 VC 里面用 KillTimer 来取消定时器。KillTimer 函数的原型如下BOOL KillTimerHWND hWnd, // 窗口句柄UINT_PTR uIDEvent // ID;与 SetTimer 一样,当在 MFC 中使用时,不用指定窗口句柄。正确取消定时器则返回true,否则返回 false.前面说到 SetTimer 第四个参数为回调函数,不设为 NULL 时,它就是一个回调函数的地址。回调函数格式如下void CALLBACK TimerProcHWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime;第一个参数是窗口句柄,第二个是消息,第三个是定时器 ID,必须与 SetTimer 中的一致,最后一个是回调函数中要使用的参数。例SetTimer1,1000,NULL;SetTimer2,2000,NULL;//这样产生了两个定时器,我们在 OnTimer 函数中对两个不同的定时器作不同的处理void C****OnTimerUINT nIDEvent{switchnIDEvent{case 1Timer1Proc;break;case 2Timer2Proc;break;}}//当使用回调函数时(上面 SetTimer 函数第三个参数不用 NULL),nTimerid 用来判断是哪个定时器void CALLBACK TimerProcHWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime{switchnTimerid{case 1 ///处理 ID 为 1 的定时器Timer1Proc;break;case 2 ///处理 ID 为 2 的定时器Timer2Proc;break;}}最后不要忘了取消掉定时器KillTimer1;KillTimer2;差点忘了说注意事项了,回调函数的处理时间一定不能够长于定时器的时间间隔,否则的话,hiahia,后果很严重。。。、多媒体定时器前面提到的通过 SetTimer 来设置定时器的方法,操作起来很简单,但是精度不高,只能用于精度要求不高的场合,在精度要求稍高的场合中,可以用多媒体定时器。多媒体定时器有两种使用方法。1)timeGetTime 函数定时精度为 ms 级,返回从 Windows 启动开始所经过的时间。该函数是通过查询的方式来进行定时的,因此在程序中,必须建立一个循环来不断地查询以便进行定时,所以这个函数通常都在循环(do-while 或者 for 循环)中。2)timeSetEvent 函数,原型如下MMRESULT timeSetEventUINT uDelay,UINT uResolution,LPTIMECALLBACK lpTimeProc,DWORD dwUser,UINT fuEvent;第一个参数 uDelay延迟时间,也就是多久调用一定回调函数,单位为毫秒;第二个参数 uResolution时间精度,单位为毫秒,缺省时为 1ms;第三个参数 lpTimeProc回调函数;第四个参数参数 dwUser用户提供的回调数据;第五个参数 fuEvent定时器的事件类型,可以有两种取值,TIME_ONESHOT 表示执行一次;TIME_PERIODIC 表示周期性执行,调用周期为 uDelay。回调函数格式为void CALLBACK TimeProcUINT uID,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2;参数 uID 是该多媒体定时器的标识,dwUser 必须与 timeSetEvent 中的 DwUser 一致,传递回调函数中需要使用的参数。回调函数必须声明为 PASCAL 全局函数,否则编译时会有问题。如void PASCAL TimeProcUINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2{}成功后返回事件的标识符代码,否则返回 NULL。timeSetEvent 函数的使用不像 SetTimer 那样简单。一般我们在使用之前,要先确认系统的分辨率的取值范围,无误之后才开始使用。例TIMECAPS tc;//利用函数 timeGetDevCaps 取出系统分辨率的取值范围,如果无错则继续;iftimeGetDevCaps //分辨率的值不能超出系统的取值范围//调用 timeBeginPeriod 函数设置定时器的分辨率timeBeginPeriodwAccuracy;//设置定时器timeSetEventnDelay,wAccuracy,lpTimeProc, dwUser,TIME_PERIODIC;}在精度要求较高的情况下,如要求定时误差不大于 1ms 时,可以利用 GetTickCount函数,它返回自计算机启动后的时间,返回值是 DWORD 型,单位为毫秒。通过两次调用GetTickCount 函数,然后控制它们的差值来取得定时效果。GetTickCount 函数不带参数。与前面提到的 timeGetTime 类似的,必须有定时查询。前面多次提到查询这个词,下面就举个例子来说明怎么来实现吧。下面的一小段程序实现的是一个 50ms 的定时。DWORD dwStart, dwStop ;dwStop GetTickCount;whileTRUE{// 上一次的中止值变成新的起始值,开始新一次的定时dwStart dwStop ;// 这里可以添加处理程序do{dwStop GetTickCount ; //查询时间}whiledwStop-50 SetWindowTextstrTmp; //在 Lable 中设置新值,表明定时器已经工作。CDialogOnTimernIDEvent;}回调函数的使用。如果不想使用窗体的 WM_TIMER 消息函数处理,可以使用回调函数来取代,读者可以在上面例子的基础上,增加一个回调函数,以证实前面的讨论。首先,定义一个回调函数,回调函数的定义必须按照如下格式。void CALLBACK TimerProcHWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime ;我的实现函数如下void CALLBACK TimerProcHWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime {AfxMessageBox“Timer is running“;//定时器时间到,强出一对话框,表明定时器已经运行。}将上面的启动函数稍做修改void CTestDlgOnButtonStart {// SetTimer1,1000,NULL;//启动定时器 1,定时时间是 1 秒SetTimer1,1000,TIMERPROCTimerProc;//用回调函数处理,此时对话框的消息处理函数不再处理。}
展开阅读全文
收藏
下载资源

加入会员免费下载





足球比分直播