多媒体定时器相比普通的定时器有更高的优先级与精度。
1.多媒体定时器
1,头文件中添加相关内容
#include <MMSystem.h>
#pragma comment(lib,"winmm")
在头文件类中定义多媒体定时器函数
static void CALLBACK TimeProc(
UINT uID,
UINT uMsg,
DWORD dwUser,
DWORD dw1,
DWORD dw2);
uID:多媒体定时器的ID,ID值由timeSetEvent创建定时器事件时返回
uMsg:保留,当前未使用
dwUser:由timeSetEvent传递的用户数据
dw1,dw2保留未使用
2,添加函数
创建的函数需要在头文件中声明。
//开始
void CmytimerDlg::OnBnClickedButtonStart()
{
// TODO: 在此添加控件通知处理程序代码
CreateTimer();
}
//停止
void CmytimerDlg::OnBnClickedButtonStop()
{
// TODO: 在此添加控件通知处理程序代码
DestroyTimer();
}
//创建定时器
UINT CmytimerDlg::CreateTimer()
{
timeBeginPeriod(1);
timerID = timeSetEvent(1000, 1, TimeProc, (DWORD)this, TIME_PERIODIC);
return timerID;
}
//删除定时器
void CmytimerDlg::DestroyTimer()
{
timeKillEvent(timerID);
timeEndPeriod(1);
}
原始函数包含的内容:
timeSetEvent(
UINT uDelay,
UINT uResolution,
LPTIMECALLBACKlpTimeProc,
DWORD_PTR dwUser,
UINT fuEvent
);
uDelay:定时器触发的时间间隔,以毫秒为单位。//1000
uResolution:定时器设备的时间精度,以毫秒为单位,应大于或等于timeBeginPeriod中设置的值,默认为1ms,精度越高,系统在定时器上的负载就越大,通常选择适合于应用程序的最大值
LpTimeProc:定时器触发的事件的回调函数的地址。//本次命名为TimeProc(可修改)
dwUser:传递给回调函数的数据。
fuEvent:定时类型,TIME_ONESHOT表示uDelay毫秒后只产生一次事件,TIME_PERIODIC表示每隔uDelay毫秒周期性的产生事件。
TimeProc函数:
void CALLBACK CmytimerDlg::TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
CmytimerDlg* pdcpackerdlg = (CmytimerDlg*)dwUser;
pdcpackerdlg->m_num++;
pdcpackerdlg->m_number = pdcpackerdlg->m_num;
pdcpackerdlg->OnTimer(1);
}
函数调用OnTimer()
void CmytimerDlg::OnTimer(UINT nIDEvent)
{
//输入想要用定时器实现的代码
}
3,新建文档写入内容
创建函数WriteDateToFile()用来新建文档
void CmytimerDlg::WriteDateToFile()
{
char* old_locale = _strdup(setlocale(LC_CTYPE, NULL));//区域设定
CString strFilename1, strFilePathC, strData;
CTime timeC = CTime::GetCurrentTime();//提取当前时间
//文件名设置为当前时间+WriteFile
strFilename1.Format(_T("(%d月%d日%d时%d分%d秒)"), timeC.GetMonth(), timeC.GetDay(), timeC.GetHour(), timeC.GetMinute(), timeC.GetSecond());
strFilePathC += "WriteFile";
strFilePathC += strFilename1;
strFilePathC += ".txt";
//创建文件
m_file.Open(strFilePathC, CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate);
//创建写入的内容
strData += _T("测试文本1\t\t\t");
strData += _T("测试文本2\t\t\t");
strData += _T("测试文本3\t\t\t");
strData += "\n";
//查找当前文档最后一行并将新内容写入
m_file.Seek(0, CFile::end);
m_file.WriteString(strData);
CreateTimer();//调用定时器
setlocale(LC_CTYPE, old_locale);//还原语言区域设定
free(old_locale);//还原区域设定
}
WriteDateToFile()只需要调用一次创建文件成功后调用定时器开始向文档内写内容。使用定时器实现的程序写入OnTimer()中。
void CmytimerDlg::OnTimer(UINT nIDEvent)
{
CString strData = "\n";
CString str[11];
//定义两个随机数
int tem = rand() % 10 + 30;
int hum = rand() % 10 + 30;
//随机数初始化为CString
CString strtem, strhum,strnumber;
strtem.Format(_T("%d"), tem);
strhum.Format(_T("%d"), hum);
strnumber.Format(_T("%d"), m_number);
// TODO: Add your message handler code here and/or call default
//用switch调用对应id的定时器
switch (nIDEvent)
{
case 1:
{
str[0].Format(_T("%d\t\t\t%d\t\t\t%d\t\t\t"),m_number,tem,hum );
//GetDlgItem(IDC_EDIT1)->SetWindowText(str);
break;
}
}
//保存的内容显示到MFC界面
all =all+strnumber+ "\t\t\t"+strtem+"\t\t\t"+ strhum + "\t\t\t";
SetDlgItemText(IDC_EDIT1, all);
//给strDate赋值为想要保存的内容
for (int i = 0; i < 11; i++)
{
strData += str[i];
}
//将strData中的内容保存进文档
m_file.Seek(0, CFile::end);
m_file.WriteString(strData);
}
4,关闭定时器
关闭按钮按下调用DestroyTimer()函数。
void CmytimerDlg::OnBnClickedButtonStop()
{
// TODO: 在此添加控件通知处理程序代码
DestroyTimer();
}
void CmytimerDlg::DestroyTimer()
{
//关闭定时器
timeKillEvent(timerID);
timeEndPeriod(1);
}
2.普通定时器
设置定时器
SetTimer(0, 1000, NULL);//定时器地址0 定时器精度1000ms
停止定时
KillTimer(0);
定时器启动时调用OnTimer函数,在函数中写入想要实现的功能