现在有这么一个问题,在VC编程中,如果要每隔一段时间去响应一个事件,应该怎么处理?
1.Sleep(int n)函数;(S 一定要大写,这个和C不一样)
2.WaitForSingleObject()等待函数;
其中,用Sleep()多的话应该知道,它的时间不是很精确,且会让程序陷入休眠,而且这个函数其实是VC专门为线程设计的。而等待函数是需要SetEvent来实现唤醒的。
还有第三个方法,就是定时器的使用。
我们知道,在VC的MFC中,已经为我们封装好了很多全面和强大的函数集,所以在MFC编程时,巧妙地调用MFC函数库可以为我们省去很多麻烦。其中定时器也可以在MFC程序中很好地利用。
在MFC中和定时器相关的有三个函数:
1.设置定时器(定义一个定时器的属性):
SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD));
2.定时器响应(响应系统定义WM_TIMER消息):
OnTimer( UINT nIDEvent );
3.释放定时器:
KillTimer( int nIDEvent );
其中:
UINT nIDEvent:定时器的ID,在一个程序中用这个ID来确定是那个定时器发送的消息。
UINT nElapse: 定义刷新时间,即间隔多长时间刷新一次,单位是毫秒。
void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD):回调函数的参数,实现刷新时所做的操作,一般情况下都设为0。
在这里就用一个简单的例子来说明定时器在MFC中是如何使用的。
1.建立单文档程序Timer。
2.在resource.h中定义两个定时器的ID
#define TIMER1 1
#define TIMER2 2
3.在CMainFrame的OnCreate函数中定义两个定时器的属性。
SetTimer(TIMER1,3000,0);
SetTimer(TIMER2,5000,0);
4.在类视图中右击CMainFrame属性,在消息响应函数中找到WM_TIMER,然后添加响应函数OnTimer()。
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case TIMER1:
{
AfxMessageBox("定时器1!");
break;
}
case TIMER2:
{
AfxMessageBox("定时器2!");
break;
}
default:
break;
}
CFrameWnd::OnTimer(nIDEvent);
}
5.在CMainFrame的析构函数中添加释放定时器函数。
KillTimer(TIMER1);
KillTimer(TIMER2);
这样,一个简单的定时器程序就生成了,运行后可以看到,每隔3秒就会弹出一个消息对话框“定时器1”,每隔5秒就会弹出一个消息对话框“定时器2”。
这种情况是在程序运行后定时器就直接启动了,很多时候我们需要的是在响应一次事件或者说点击一个按钮后再去执行定时器,那么这时应该怎么修改呢?也用一个实例来说明吧,因为我觉得可能说一大堆废话也抵不上一个简单而正确的实例更具说服力。
现在,我生成了一个MFC多文档应用程序,我希望在点击菜单条上的某个按钮后再去执行定时器。这时就不是在CMainFrame里面操作了,因为我们是要在对话框上进行定时器的操作,而CView这个类是负责对话框的对应操作,所以要把定时器定义在CView里面。
1.建立多文档程序Timer。
2.在resource.h中定义两个定时器的ID
#define TIMER1 1
#define TIMER2 2
3.在CTimerView的OnInitialUpdate函数中定义两个定时器的属性。
SetTimer(TIMER1,3000,0);
SetTimer(TIMER2,5000,0);
4.在类视图中右击CTimerView属性,在消息响应函数中找到WM_TIMER,然后添加响应函数OnTimer()。
void CTimerView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
//Hwnd为一个变量,初始值为false,点击某个按钮后在其响应函数中将其置为true
switch(nIDEvent && Hwnd){
case TIMER1:
{
AfxMessageBox("定时器1!");
break;
}
case TIMER2:
{
AfxMessageBox("定时器2!");
break;
}
default:
break;
}
CFrameWnd::OnTimer(nIDEvent);
}
5.在CTimerView中添加OnDestroy()函数,在函数中释放定时器。
KillTimer(TIMER1);
KillTimer(TIMER2);
现在,运行程序后,没有马上弹出预定的对话框,而是在我们点击某个按钮或者响应某个事件后对话框才弹出,同样是点击按钮后,每隔3秒弹出对话框“定时器1”,每隔5秒弹出“定时器2”。
其实在不同的类,定时器的用法都是基本一致的,只要找到类的初始函数和释放函数,就能轻松实现定时功能了,就这么简单。
分享到:
相关推荐
MFC定时器的使用MFC定时器的使用MFC定时器的使用MFC定时器的使用MFC定时器的使用MFC定时器的使用MFC定时器的使用
较为详细地介绍了MFC定时器的使用方法,希望能对就定时器不是很清楚的朋友有帮助
mfc 定时器简单用法的小例子
MFC定时器的用法,包含中文注释以及简单的用法介绍。VC6直接编译运行,其他VS双击打开自动完成转换。
不错的一个MFC定时器源代码
MFC定时器的使用 PPT,简洁易懂; MFC定时器的使用 PPT,简洁易懂。
这个是VC定时器SetTimer函数,主要做的事情是循环,和刷新MFC对话框
本人开发此工具目的有两个,一、熟悉MFC空间操作,熟悉MFC定时器的操作和使用。二、由于本人整天对着电脑,经常容易忘记时间,如果自己做一个定时器,能够在设定时间提醒自己该做什么事。那可是一举多得的事情。最后...
MFC 通过定时器实现space键的暂停和开始 , 该方法原理能够实现MFC图片幻灯片暂停/开始播放.
MFC中利用多线程实现定时器,对于学习多线程和 ontimer的同学有用
基于MFC的定时器,实现自己定时,到了指定时间播放音乐,播放音乐的空间是windows地带的mediaplayer
vs2019 MFC 多媒体定时器 ms级定时器
定时器、创建主线程、子线程
定时器定时截取桌面图像,然后显示在view区,VS2010工程。
这一个有具高精度的C++MFC实现的定时器,初学MFC的同志可以考虑参考一下
使用 定时器 (MFC) 示例代码 C++ 简单的小程序,功能齐全,开发简单,易于学习
用MFC写的简易定时器,开始时设置倒计时秒数,提醒时间。双击开始倒计时,单击暂停,右键复位。 希望可以有些用处。
一个简单的类,注释很详细,就一个类包含定时器的启动停止超时判断等简单功能!
mfc定时器原代码,制作于2009年4月,平台vc6.0,有一定注释,可以显示日期,时间,计时,倒计时,闹钟,选择播放三种不同铃声
很简单程序,MFC中设置一个定时器(1s刷新一次),注意这个WM_TIMER是要从对话框那里添加,以前我给搞错了