我们知道手机里面的闹钟可以设个时间,然后选择重复,这样每天会按时响.在Oracle中设定一个job也可以让它在每天预定的时间执行.
那同样假如你想让一些代码每过多长时间自动执行一次咋整呢?在MFC中可以使用timer,用法如下
新建一个MFC project,类型选Dialog,
使用闹钟之前先得设定下时间嘛.这里同时也先设定下多久
//TimerTestDlg.h///
afx_msg void OnTimer(UINT_PTR nIDEvent); //回调函数,这里的函数名OnTimer不能换成其他名字.固定的
TimerTestDlg.cpp//
#include "afxmt.h"
#define TIMERID 8
//指定一个timer的ID,你可以同时设定多个timer,就用ID来区分
BEGIN_MESSAGE_MAP(CTimerTestDlg, CDialog)
ON_WM_TIMER()
END_MESSAGE_MAP()
CCriticalSection g_criSection;
BOOL CTimerTestDlg::OnInitDialog()
{
SetTimer(TIMERID,1000,0); //这里就相当于设定了timer,如果要停掉timer就是KillTimer(TIMERID)
}
void CTimerTestDlg::OnTimer(UINT_PTR nIDEvent)
{
g_criSection.Lock();
static int nShowNum = 1;
if( nIDEvent == 8)
{
CString strInfo;
strInfo.Format("I am number %d", nShowNum);
GetDlgItem(IDC_STATIC)->SetWindowsText(strInfo); //假如有一个text control ,用来显示数字
}
g_criSection.Unlock();
}
SetTimer 与 KillTimer两个类的定义
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
每一个参数表示timer id,用来区分不同的timer,假如同时定义了几个timer,在OnTimer()中做不同处理时,可以判断nIDEvent是哪一个.
nElapse表示多长时间执行一次,单位是毫秒,1000就是一秒.
lpfnTimer是回调函数,上面的示例是写成0,表示不显式指定回调函数,这样就是是调用OnTimer,如果你显式指定了回调函数,则OnTimer()函数就不会被调用了.
BOOL KillTimer( int nIDEvent);
直接通过timer id就停掉timer就行了.
void CALLBACK Test(HWND hWnd,UINT para1,UINT_PTR para2,DWORD para3)
{
}
BOOL CTimerTestDlg::OnInitDialog()
{
SetTimer(TIMERID,1000,Test); //直接调用Test,这样之前写的OnTimer函数就永远不会被调用到了.
}
上面讲的SetTimer和KillTimer是类CWnd中的方法,只要继承自它的窗口类都可以使用.
不过如果不是窗口类中也可以用timer,使用API的全局函数
UINT SetTimer(
HWND hWnd, UINT nIDEvent, UINT uElapse,TIMERPROC lpTimerFunc);
其中后面三个参数跟上面的一样,只是多了个参数hWnd,指定一个窗口类的句柄.
同样KillTimer也只是多了这一个参数
BOOL KillTimer(
HWND hWnd, // handle of window that installed timer
UINT uIDEvent // timer identifier
);