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

实验的效果

在这里插入图片描述
按下定时器开始显示累加数字,再按下暂停,再按下继续.就这么一个简单的功能.

需要一个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型的.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Delphi 11 64位中使用 timeSetEvent 函数可能会遇到一些问题,因为该函数是32位 Windows API 的一部分,而 Delphi 11 64位是基于 64位 Windows API 的。 为了在 Delphi 11 64位中使用 timeSetEvent 函数,你需要使用一个代替方案。一个可用的代替方案是使用 CreateTimerQueueTimer 函数。这个函数可以创建一个定时器,并在指定的时间间隔内重复调用一个回调函数。 以下是一个使用 CreateTimerQueueTimer 函数的示例代码: ``` var TimerQueue: THandle; TimerHandle: THandle; procedure TimerCallback(lpParameter: Pointer; TimerOrWaitFired: Boolean); begin // 处理定时器触发后的事件 end; // 创建定时器 procedure CreateTimer; begin TimerQueue := CreateTimerQueue; if TimerQueue <> 0 then begin // 创建定时器 if not CreateTimerQueueTimer(TimerHandle, TimerQueue, @TimerCallback, nil, 1000, 1000, 0) then RaiseLastOSError; end else RaiseLastOSError; end; // 销毁定时器 procedure DestroyTimer; begin DeleteTimerQueueTimer(TimerQueue, TimerHandle, INVALID_HANDLE_VALUE); DeleteTimerQueue(TimerQueue); end; ``` 在上面的代码中,我们首先使用 CreateTimerQueue 函数创建一个定时器队列。然后使用 CreateTimerQueueTimer 函数创建一个重复触发的定时器,并指定回调函数 TimerCallback。在回调函数中,我们可以处理定时器触发后的事件。最后,在程序退出时,我们调用 DeleteTimerQueueTimer 和 DeleteTimerQueue 函数销毁定时器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波雅_汉库克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值