多媒体定时器与普通定时器保存TXT文件

多媒体定时器相比普通的定时器有更高的优先级与精度。

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函数,在函数中写入想要实现的功能

01-22 2942
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值