摘要:
什么时候我们需要用到SetTimer函数呢?
当你需要每隔一段时间执行一件事的的时候就需要使用SetTimer函数。使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。
Settimer是设置一个计时器并开始执行计时器Ontimer中的代码,Ontimer是计时器所执行的代码。
KillTimer用于停止计时器。 Settimer是设置,Ontimer是响应Settimer消息的。
函数:
头文件 #include<Windows.h>
(1)用WM_TIMER来设置定时器
先请看SetTimer这个API函数的原型
UINT_PTR SetTimer(
HWND hWnd,//和定时器相关联的窗口
UINT_PTR nIDEvent,//一个非0的数字标志这个定时器
UINT uElapse,//指定时间间隔,以毫秒为单位
TIMERPROC lpTimerFunc//一般指定为null
);
当在MFC的工程中如下:
UINT_PTR SetTimer(
UINT_PTR nIDEvent,//一个非0的数字标志这个定时器
UINT uElapse,//指定时间间隔,以毫秒为单位
TIMERPROC lpTimerFunc//一般指定为null
);
用法如下:
//@param:1 计时器的名称;
//@param: 1000 时间间隔,单位是毫秒;
//@param: NULL 使用onTime函数。
SetTimer(1,1000,NULL);
在每次时间到1s时会触发WM_TIMER消息,其消息响应函数如下:
void CXXX::OnTimer(UINT_PTR nIDEvent) {
// TODO: 在此添加消息处理程序代码和/或调用默认值
// 此处加入如下代码就好了:
switch(){
case 1:
//做该做的事情
//当不需要的时候在此处调用KillTimer(1);
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
当不需要计时器的时候调用KillTimer(nIDEvent);
KillTimer(1);
(2)多个SetTimer的使用
SetTimer(2,1000,NULL);SetTimer(3,500,NULL);
WINDOWS会协调他们的。当然onTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码:
onTimer(nIDEvent){
switch(nIDEvent){
case 1:........;
break;
case 2:.......;
break;
case 3:......;
break;
}
}
1.2 调用回调函数
此方法首先写一个如下格式的回调函数
void CALLBACK TimerProc
(
HWND hWnd,
UINT nMsg,
UINT nTimerid,
DWORD dwTime
);
然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。
1.3 取消定时器
不再使用定时器后,我们应该调用KillTimer来取消定时,KillTimer的原型如下
BOOL KillTimer(
HWND hWnd, // 窗口句柄
UINT_PTR uIDEvent // ID
);
在MFC程序中我们可以直接调用KillTimer(int nIDEvent)来取消定时器。
如:KillTimer(1);
测试程序:
#include <iostream>
#include <Windows.h>
using namespace std;
void CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
{
SYSTEMTIME sys;
GetLocalTime(&sys);
printf("M/d/d d:d:d.d xingqi \n", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, sys.wDayOfWeek);
}
void main()
{
MSG msg;
SetTimer(NULL, 230, 1000, (TIMERPROC)TimerProc);
while (GetMessage(&msg, NULL, NULL, NULL))
{
if (msg.message == WM_TIMER)
{
TranslateMessage(&msg);///TranslateMessage函数将虚拟键消息转换成字符消息
/*该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。
消息被调度到的窗口程序即是MainProc()函数*/
DispatchMessage(&msg);
//break; //此处最好有一个这个,不然貌似Killtimer结束不了定时器的样子.
}
}
KillTimer(NULL, 230);
}
参考文章:
1. https://blog.csdn.net/u011555996/article/details/77587799
2. https://www.cnblogs.com/lingc/p/3380919.html
3. http://blog.sina.com.cn/s/blog_b74670be0102v5pr.html
4. https://www.cnblogs.com/ssyfj/p/8490468.html