多媒体定时器相比普通的定时器有更高的优先级与精度。
1.多媒体定时器1,头文件中添加相关内容
#include#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("测试文本1ttt"); strData += _T("测试文本2ttt"); strData += _T("测试文本3ttt"); 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("%dttt%dttt%dttt"),m_number,tem,hum ); //GetDlgItem(IDC_EDIT1)->SetWindowText(str); break; } } //保存的内容显示到MFC界面 all =all+strnumber+ "ttt"+strtem+"ttt"+ strhum + "ttt"; 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函数,在函数中写入想要实现的功能
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)