MFC timeSetEvent() 定时器的简单使用*

  • Post author:
  • Post category:其他




实验的效果

在这里插入图片描述

按下定时器开始显示累加数字,再按下暂停,再按下继续.就这么一个简单的功能.

需要一个button和一个静态框,这里就不赘述了.button下的代码:

void CtimerDlg::OnBnClickedTimer()
{
	// TODO: Add your control notification handler code here
	CtimerApp* app = static_cast<CtimerApp*>(AfxGetApp());
	app->SetTimer();
}

很简单就是在项目类中设置计时器.看看SetTimer()函数.

void CtimerApp::SetTimer()
{
	m_bBlag = !m_bBlag;
	if (m_bBlag)
	{
		wTimerRes = 100;
		timer = timeSetEvent(500, 10, callBackTimer, wTimerRes, TIME_PERIODIC);
	}
	else
	{
		timeEndPeriod(wTimerRes);
		timeKillEvent(timer);
	}
}

这个就是定时器的实现.

思路就是按下去创建定时器,再按下删除定时器.

重点介绍一下timeSetEvent()这个定时器函数,这是个win32的函数,所以直接用是用不了的,需要在头文件中添加引用.

#include <windows.h>
#pragma comment(lib,"Winmm.lib")
#include <MMSystem.h>

我在timer.h中添加了这个,不添加这个是编译不过去,报2019和2001错误.

在回头细看一下这个函数.

 
MMRESULT timeSetEvent( UINT uDelay, 
                             				    UINT uResolution, 
                                 				LPTIMECALLBACK lpTimeProc, 
                              				   WORD dwUser, 
                               				  UINT fuEvent )
 
        uDelay:以毫秒指定事件的周期。
         Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。
         LpTimeProc:指向一个回调函数。
         DwUser:存放用户提供的回调数据。
         FuEvent:指定定时器事件类型:
         TIME_ONESHOT:uDelay毫秒后只产生一次事件
         TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。

第一个参数是事件周期,也就是定时多长事件.第二个是精度,第三个是回调函数,也就是定时器到了要执行的函数,这个函数是有要求的,下面重点说.第四个参数是给回调函数传递的值,第五个参数是产生的事件.

重点说一下回调函数.

void CALLBACK callBackTimer(UINT wTimerID, UINT msg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);

这个函数一定是个全局函数,而且一定要写成这样的,函数名字可以变,其他的一律不能动.因为这是个函数指针,函数签名是定死的.

typedef void (CALLBACK TIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
typedef TIMECALLBACK FAR *LPTIMECALLBACK;

这是timeSetEvent()函数的第三个参数的定义,他的返回值和参数都定死了,随意改是不行的.



回调函数的内容:

void CALLBACK callBackTimer(UINT wTimerID, UINT msg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{	
	auto a = dwUser;
	CtimerApp* app = static_cast<CtimerApp*>(AfxGetApp());
	CString str;
	str.Format(L"%d",app->num);	
	app->m_pMainWnd->GetDlgItem(IDC_STATIC)->SetWindowTextW(str);
	app->num++;
}

这个没什么说的,重点是怎么用定时器.

说个细节就是auto a = dwUser; dwUser这个参数就是之前timeSetEvent() 这个函数的第四个参数传进来的参数.虽然这个类型是个unsigned long的我觉得也可以传递指针,毕竟指针也是16进制的数.没有尝试,有兴趣可以试试.



用完了怎么把这个定时器,怎么删除.

		timeEndPeriod(wTimerRes);
		timeKillEvent(timer);

这就是删除定时器的函数,第一个函数是释放给回调函数的值,第二个函数是释放timeSetEvent()定时器函数返回的值,返回值是UINT型的.



版权声明:本文为m0_38036750原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。