VC++ WM_TIMER定时器用法
winform 定时器用法
winform 定时器用法WinForm中的定时器通常指的是System.Windows.Forms.Timer 类,它允许您在Windows窗体应用程序中创建定时事件。
定时器允许您指定一个间隔,然后在该间隔过后执行特定的代码。
以下是关于WinForm定时器的用法:1. 创建定时器对象,首先,您需要在窗体或其他适当的位置创建一个Timer对象。
您可以在设计视图中拖放Timer控件,或者在代码中实例化一个Timer对象。
2. 设置定时器属性,在创建Timer对象后,您可以设置其属性,最重要的是Interval属性,它表示触发事件之间的时间间隔(以毫秒为单位)。
您还可以设置Enabled属性来启用或禁用定时器。
3. 编写定时事件处理程序,接下来,您需要编写定时器的Tick事件处理程序。
Tick事件会在定时器间隔时间到达时触发,您可以在该事件处理程序中编写您想要执行的代码。
4. 启动和停止定时器,一旦设置了定时器对象和事件处理程序,您可以通过设置Enabled属性来启动或停止定时器。
当Enabled属性设置为true时,定时器将开始计时并在间隔时间到达时触发Tick事件。
5. 处理定时器事件,在Tick事件处理程序中,您可以执行任何您想要在特定时间间隔内执行的操作,比如更新UI、执行特定任务等。
需要注意的是,定时器是在UI线程上运行的,因此在处理长时间运行的任务时要小心,以免阻塞UI线程。
另外,定时器的精度受系统资源和其他因素影响,因此不应该依赖于它来执行需要高精度定时的任务。
总之,WinForm中的定时器是一种方便的工具,可以帮助您执行定时任务和更新UI。
通过设置定时器的属性和编写相应的事件处理程序,您可以在应用程序中实现定时操作。
VC++中使用定时器的方法
1.启用一个定时器直接调用函数:SetTimer(1,500,NULL);//定义时钟1,时间间隔为500ms SetTimer(2,1000,NULL);//定义时钟2,时间间隔为1000ms 可以在按钮按下时启用定时器:void CTimeDlg::OnButton1(){// TODO: Add your control notification handler code hereSetTimer(1,500,NULL);//定义时钟1,时间间隔为500ms SetTimer(2,1000,NULL);//定义时钟2,时间间隔为1000ms }2.关闭定时器:可以在按钮中调用如下函数关闭某定时器: void CTimeDlg::OnButton2(){// TODO: Add your control notification handler code hereKillTimer(1); //关闭1号定时器KillTimer(2); //关闭2号定时器}3.添加定时器时间到的处理代码:1)在开发界面中Ctrl+W 进入MFCclass wizard页面2)选择Message Maps选项卡3)在Project中选择你的工程4)在object Ids:中选择C…..Dlg5)在Messages:中选择WM_TIMER,此时,Member functions中自动定位到: W OnTimer ON_WM_TIMER,6) 单击EDIT code(或双击W OnTimer ON_WM_TIMER)自动进入如下函数:void CTimeDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultswitch(nIDEvent){case 1: //1号定时器应该处理的事情//…..break;case 2: //2号定时器应该处理的事情//…..break;}CDialog::OnTimer(nIDEvent); //此句VC自动生成}秘密在VC中,定时有三种方法,一是利用WM_TIMER消息的API函数,二是使用多媒体定时器,三是多线程定时器(不知道是不是可以这样分啊)。
winformtimer用法
winformtimer用法WinForm Timer 是一个用于在Windows窗体应用程序中创建计时器的组件。
它可以在一段时间后触发事件,并且可以设置重复定时还是单次定时。
以下是WinForm Timer 的用法解释和示例:1. 添加 Timer 控件到窗体:在Visual Studio 的工具箱中,选择 Timer 组件,然后将其拖拽到窗体上。
这将自动在窗体上添加一个 Timer 控件。
2. 设置 Timer 控件的属性:在属性窗口中,可以设置以下属性来控制计时器的行为:- Enabled: 是否启用计时器。
如果设置为True,计时器将开始计时;如果设置为False,计时器将停止计时。
- Interval: 触发计时器事件的时间间隔,以毫秒为单位。
3.编写计时器事件的处理代码:在窗体类中,可以通过双击 Timer 控件或手动编写代码来创建计时器事件的处理程序。
例如,可以使用以下代码来处理计时器事件:```//在此处编写计时器事件的处理代码//例如,可以更新UI、执行一些操作或触发其他事件```4.启动和停止计时器:可以通过设置 Timer 控件的 Enabled 属性为 True 或 False 来启动和停止计时器。
例如,可以在窗体加载时启动计时器,通过以下代码实现:```private void Form1_Load(object sender, EventArgs e)```5.处理计时器事件:```label1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");```6.定义单次或重复计时器:WinForm Timer 默认为重复计时器,也就是每隔一段时间触发一次事件。
如果想将其设置为单次计时器,可以在计时器事件处理代码中添加以下代码来停止计时器:```//处理事件的代码```7.在计时器事件中执行UI操作:在一些情况下,可能需要在计时器事件中执行UI操作。
VC++实验七MFC定时器编程实验
VC++实验七MFC定时器编程实验实验七MFC 定时器编程实验一、预备知识1、定时器消息定时器时间到时,向窗口发送WM_TIMER 消息,应用程序窗口通过处理该消息来对定时器事件进行处理,该消息的参数说明如下:WM_TIMERwTimerID = wParam; // 定时器标识符tmprc = (TIMERPROC *) lParam; // 定时器回调函数的地址其中,定时器回调函数在使用SetTimer 启动定时器时指定,如果没有指定定时器回调函数则可直接通过消息映射处理WM_TIMER 消息。
2、启动定时器使用SetTimer 函数创建一个定时器,并制定超时时间,然后启动定时器。
该函数说明如下:UINT SetTimer(UINT nIDEvent, // 定时器标识符UINT nElapse, // 定时时间,单位是毫秒void (CALLBACK EXPORT* lpfnTimer) // 定时器回调函数地址(HWND, UINT, UINT, DWORD));示例代码:SetTimer(1,200,NULL);3、销毁定时器定时器在不使用时要使用KillTimer 函数进行销毁,该函数说明如下:BOOL KillTimer(int nIDEvent // 定时器标识符);示例代码:KillTimer(1);二、实验目的(1) 掌握Visual Studio 开发环境调试程序的方法;(2) 熟练使用类向导进行消息映射;(3) 掌握MFC 编程模式中定时器的使用方法。
三、实验内容设计一个窗口,在窗口中间位置绘制一个红色粗实线的矩形,并用交替使用三种不同样式的画刷填充矩形的内部,每次刷新的时间间隔为1.0 秒。
单击鼠标左键启动定时器,单击鼠标右键停止定时器。
四、编程实验部分程序及运行结果(1) 列出定时器操作相关的程序清单1、WM_PAINT消息的处理//OnPaint()函数实现用自定义画笔绘制一个矩形//并调用相应的画刷填充图形内部void CDemoDlg::OnPaint(){CPaintDC dc(this);CPen Pen, *pOldPen;CBrush Brush;Pen.CreatePen(PS_SOLID, 6, RGB(255, 0, 0));//m_nStyle用于选择不同的画刷填充图形内部switch (m_nStyle){case 0:Brush.CreateSolidBrush(RGB(0,0,255));break;case 1:Brush.CreateHatchBrush(HS_DIAGCROSS, RGB(0, 255, 255));break;case 2:Brush.CreateSolidBrush(RGB(0, 255, 0));break;default:break;}pOldPen = dc.SelectObject(&Pen);dc.SelectObject(&Brush);dc.Rectangle(100, 50, 450, 260);dc.SelectObject(pOldPen);}2、WM_LBUTTONDOWN消息的处理//当按下鼠标左键时启动定时器void CDemoDlg::OnLButtonDown(UINT nFlags, CPoint point) {// TODO: 在此添加消息处理程序代码和/或调用默认值SetTimer(1, 1000, NULL);CDialog::OnLButtonDown(nFlags, point);}3、WM_RBUTTONDOWN消息的处理//当按下鼠标右键是取消定时器void CDemoDlg::OnRButtonDown(UINT nFlags, CPoint point) {// TODO: 在此添加消息处理程序代码和/或调用默认值KillTimer(1);CDialog::OnRButtonDown(nFlags, point);}4、WM_Timer消息的处理//当按下鼠标右键是取消定时器void CDemoDlg::OnRButtonDown(UINT nFlags, CPoint point) {// TODO: 在此添加消息处理程序代码和/或调用默认值KillTimer(1);CDialog::OnRButtonDown(nFlags, point);}//定时器消息处理函数void CDemoDlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值//判断m_nStyle的值,实现用不同颜色的画刷填充图形if (m_nStyle < 2){m_nStyle++;}else{m_nStyle = 0;}//刷新图形InvalidateRect(NULL);CDialog::OnTimer(nIDEvent);}5、实验结果五、实验总结(1) 总结定时器消息编程的步骤,以及程序设计过程中需要注意的问题定时器消息WM_TIMER消息:消息号:WM_TIMER字参数:wParam ==》定时器标识长字参数:(TIMERPROC *) lParam==》定时器回调函数地址CWnd::SetTimer()功能:设置定时器UINT SetTimer(UINT nIDEvent, // 定时器标识符UINT nElapse,void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD));CWnd ::KillTimer()功能:销毁定时器BOOL KillTimer(int nIDEvent // 定时器标识符);消息映射:1、消息映射宏ON_MESSAGE(WM_TIMER,OnTimer)2、消息处理函数声明LRESULT OnTimer(WPARAM wParam,LPARAM lParam) ;3、消息处理函数实现LRESULT CDrawWnd::OnTimer(WPARAM wParam, LPARAM lParam){return 0;}(2) 总结实验的心得体会,实验中遇到的困难以及解决的方法等通过本次实验编程,我学习掌握了从类向导中直接添加消息映射的步骤和方法,了解到通过类向导可以直接在项目中直接添加消息映射,添加处理函数,添加命令,添加成员变量等,使用类向导为我们的编程带来了许许多多的方便,省去了手动添加消息映射,添加成员函数的麻烦。
VC七种计时方法
方式六:使用多媒体定时器timeSetEvent()函数,该函数定时精度为ms级。利用该函数可以实现周期性的函数调用。如示例工程中的Timer6和Timer6_1。函数的原型如下:
MMRESULT timeSetEvent( UINT uDelay,
UINT uResolution,
COleDateTimeSpan end_time= COleDateTime::GetCurrentTime()-start_time;
while(end_time.GetTotalSeconds()< end_time =" COleDateTime::GetCurrentTime()-start_time;">
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
do
{
dwEnd = GetTickCount()-dwStart;
}while(dwEnd <50);
为使GetTickCount()函数在延时或定时期间能处理其他的消息,可以把代码改为:
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
do
{
MSG msg;
vc时间函数
2000-08-14 15:27:40
随着软硬件的飞速发展,计算机技术已经广泛地应用到自动化控制领域,为了实现实时控制,控制程序必须能够精确地完成定时和计时功能。VC提供了很多关于时间操作的函数,下面根据它们精度的不同,分别进行说明。
一般时控函数
VC程序员都会利用Windows的WM—TIMER消息映射来进行简单的时间控制:1.调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200毫秒的时间间隔;2.在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成时间到时的操作。这种定时方法是非常简单的,但其定时功能如同Sleep()函数的延时功能一样,精度较低,只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况,而在精度要求较高的条件下,这种方法应避免采用。
typedef union —LARGE—INTEGER
{
struct
{
DWORD LowPart; // 4字节整型数
LONG HighPart; // 4字节整型数
};
LONGLONG QuadPart;
// 8字节整型数
精度时控函数
在要求误差不大于1毫秒的情况下,可以采用GetTickCount()函数,该函数的返回值是DWORD型,表示以毫秒为单位的计算机启动后经历的时间间隔。使用下面的编程语句,可以实现50毫秒的精确定时,其误差小于1毫秒。
DWORD dwStart, dwStop;
// 起始值和终止值
dwStop = GetTickCount();
while(TRUE)
{
dwStart = dwStop;
WM_TIMER消息的使用方法
银监统计类考试侧重金融监管相关的统计学理论和实务,包括统计学基础、宏观经济学、金融学、财务管理、会计学、金融风险管理、管理信息系统等;S e t T i m e r函数用于创建一个计时器,K i l l T i m e r函数用于销毁一个计时器。
计时器属于系统资源,使用完应及时销毁。
S e t T i m e r的函数原型如下:U I N T_P T R S e t T i m e r(H W N D h W n d,U I N T_P T R n I D E v e n t,U I N T u E l a p s e, T I M E R P R O C l p T i m e r F u n c);其中h W n d是和t i m e r关联的窗口句柄,此窗口必须为调用S e t T i m e r的线程所有;如果h W n d为N U L L,没有窗口和t i m e r相关联并且n I D E v e n t参数被忽略n I D E v e n t是t i m e r的标识,为非零值;如果h W n d为N U L L则被忽略;如果h W n d 非N U L L而且与t i m e r相关联的窗口已经存在一个为此标识的t i m e r,则此次S e t T i m e r调用将用新的t i m e r代替原来的t i m e r。
t i m e r标识和窗口相关,两个不同的窗口可以拥有n I D E v e n t相同的t i e m ru E l a p s e是以毫秒指定的计时间隔值,范围为1毫秒到4,294,967,295毫秒(将近50天),这个值指示W i n d o w s每隔多久时间给程序发送W M_T I M E R消息。
l p T i m e r F u n c是一个回调函数的指针,俗称T i m e r F u n c;如果l p T i m e r F u n c为N U L L,系统将向应用程序队列发送W M_T I M E R消息;如果l p T i m e r F u n c指定了一个值,D e f W i n d o w P r o c将在处理W M_T I M E R消息时调用这个l p T i m e r F u n c 所指向的回调函数,因此即使使用T i m e r P r o c代替处理W M_T I M E R也需要向窗口分发消息。
如何在VC中定时
如何在VC中定时?想在程序中使用定时功能,该怎么做?就是wm_timer里,你知道了吧,按ctrl+w找wm_timer网友:zkoperater第一种方法:创建timer:settime(1,1000,null);销毁timer:killtime(1);在ontime里做你想做的事情,如果你想每秒钟弹出一个messagebox,你就在ontime里面写messagebox("hi");由于ontime的消息也要放在消息队列里,所以这种方法有少许误差。
第二种方法:开一个线程,然后用gettickcount,线程里面代码如下:int ncounter=0;int nt1=gettickcount;int nt2;while(1){nt2=gettickcount();if(nt2-nt1>1000){//...messagebox("hi");//...nt1+=1000;}}这种方法更精确。
第三种方法:和第二种方法类似,但是用getporformancefrequency,getporformancecounter代替gettickcount这种方法更更更精确。
网友:kulukyo用settimer可以,但是不是很精确,它是以55ms为一个时钟周期的。
比如你定了小于55ms的时间,settimer(1,40,null)其实是到了55ms的时候才触发,但是对于一般的应用,已经够了,如果需要精确定时,可以使用multimedia timers,但是比较耗资源可以在msdn中索引“multimedia timers”找到相关介绍。
VC定时器的用法实例详解
VC定时器的⽤法实例详解本⽂实例讲述了VC中定时器的⽤法,分享给⼤家供⼤家参考。
具体⽤法分析如下:定时器在VC中的使⽤频繁,其原型为:复制代码代码如下:WINUSERAPI UINT WINAPI SetTimer ( HWND hWnd , UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);其中的参数⽤法如下:hWnd 是欲设置定时器的窗体句柄。
定时时间到时,系统会向该窗体发送WM_TIMER消息。
nIDEvent 定时器标识符。
在⼀个窗体内可以使⽤多个定时器,不同的定时器根据nIDEvent来区分。
uElapse 定时时间,单位是毫秒。
lpTimerFunc 定时器的回调函数。
如果该值为NULL,定时时间到时,定时器发送的消息WM_TIMER由窗体映像该消息的函数处理;否则由回调函数处理,说⽩⼀点,回调函数就是取代OnTimer的处理函数。
通常,我们在使⽤定时器时,只⽤到三个参数,即复制代码代码如下:UINT CWnd::SetTimer(UINT nIDEvent,UINT nElapse,void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );其实,这个函数只是MFC对API的封装,其实现函数为:复制代码代码如下:_AFXWIN_INLINE UINT CWnd::SetTimer(UINT nIDEvent, UINT nElapse,void (CALLBACK* lpfnTimer)(HWND, UINT, UINT, DWORD)){ASSERT(::IsWindow(m_hWnd));return ::SetTimer(m_hWnd, nIDEvent, nElapse, (TIMERPROC)lpfnTimer);}由此可见,CWnd::SetTimer只是将API函数SetTimer的第⼀个参数设置成它⾃⼰的句柄⽽已。
MFC定时的用法
VC 中的定时VC中提供了很多关于时间操作的函数,编写程序时我们可以跟据定时的不同精度要求选择不同的时间函数来完成定时和计时操作。
方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。
首先调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔。
然后在应用程序中增加定时响应函数 OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间的操作。
这种定时方法非常简单,可以实现一定的定时功能,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,最小计时精度仅为18ms。
CPU占用低,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应用。
只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。
方式二:VC中使用sleep()函数实现延时,它的单位是ms,如延时2秒,用sleep(2000)。
精度非常低,最小计时精度仅为30ms,用sleep函数的不利处在于延时期间不能处理其他的消息,如果时间太长,就好象死机一样,CPU占用率非常高,只能用于要求不高的延时程序中。
方式三:利用COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程来实现秒级延时。
以下是实现2秒的延时代码:COleDateTime start_time = COleDateTime::GetCurrentTime();COleDateTimeSpan end_time= COleDateTime::GetCurrentTime()-start_time;while(end_time.GetTotalSeconds()< 2) //实现延时2秒{MSG msg;GetMessage(&msg,NULL,0,0);TranslateMessage(&msg);DispatchMessage(&msg);//以上四行是实现在延时或定时期间能处理其他的消息,//虽然这样可以降低CPU的占有率,//但降低了延时或定时精度,实际应用中可以去掉。
VC++中通过SetTimer函数创建并使用定时器
VC++中通过SetTimer函数创建并使用定时器SetTimer函数可以用来创建或设置一个定时器,该函数创建的定时器与Timer控件(定时器控件)效果相同。
当你想每隔一段时光执行一件事的的时候,你可以用法它。
用法定时器的办法比较容易,通常告知WINDOWS一个时光间隔,然后WINDOWS以此时光间隔周期性触发程序。
通常有两种办法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。
SetTimer函数的使用 1.1 用WM_TIMER来设置定时器先请看SetTimer这个API函数的原型 UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID推断是哪个定时器 UINT uElapse, // 时光间隔,单位为毫秒 TIMERPROC lpTimerFu // 回调函数 ); 例如SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了于是SetTimer函数的原型变为: UINT SetTimer(UINT nIDEvent,UINT nElapse,vo(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD)) 当用法SetTimer函数的时候,就会生成一个计时器。
函数中nIDEvent指的是计时器的标识,也就是名字。
nElapse指的是时光间隔,也就是每隔多长时光触发一次大事。
第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是用法系统默认的回调函数,系统默认认的是onTime函数。
这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:在ClassWizard里,挑选需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。
C语言VC下实现定时任务的方法讨论
C语言VC下实现定时任务的方法讨论实现定时任务无非就是想在未来的某一时刻执行一个任务,最先想到的就是WM_TIMER消息。
方法1:WM_TIMER消息无论是否是窗口函数都可以使用它启动:SetTimer(HWND hWnd,UINT uID,UINT uElapse,TIMERPROC lpTimerFunc);停止:KillTimer(UINT uID);在MFC中封装了上面的函数将HWND hWnd参数去掉即可。
有窗口将lpTimerFunc函数指针置为空否则写一个回调函数传进去即可,当经过了uElapse时就执行此回调函数。
WM_TIMER权限低可能被系统丢掉不执行,重复判断浪费资源。
方法2:使用内核对象创建等待定时器HANDLE CreateWaitableTimer(LPSECURITY_ATTRIBUTES lpTimerAttributes,//安全属性一般为默认空BOOL bManualReset,//是否手动重置LPCTSTR lpTimerName //定生器的名称默认为空);设置等待定时器等待时间BOOL SetWaitableTimer(HANDLE hTimer,//上面的函数返回的参数const LARGE_INTEGER* pDueTime,//等待的时间LONG lPeriod,//间隔的时间PTIMERAPCROUTINE pfnCompletionRoutine,//APC回调函数LPVOID lpArgToCompletionRoutine,//传进APC回调函数的参数BOOL fResume //是否恢复系统的节电模式);DWORD dwRst = WaitForMultipleObjects(1,hTimer,FALSE,INFINITE);创建一个线程然后执行上面的函数等待定时器被激活然后执行相应的任务。
上面只是给了一个想法具体的实现必须清楚多线程编程等知识。
Windows下的精确定时器
Windows下的精确定时器在日常的程序开发工作中,有时会遇到许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条等等。
特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要精确定时操作。
众所周知,Windows 是基于消息机制的系统,任何事件的执行都是通过发送和接收消息来完成的。
这样就带来了一些问题,如一旦计算机的CPU被某个进程占用,或系统资源紧张时,发送到消息队列中的消息就暂时被挂起,得不到实时处理。
因此,不能简单地通过Windows消息引发一个对定时要求严格的事件。
另外,由于在Windows中已经封装了计算机底层硬件的访问,所以,要想通过直接利用访问硬件来完成精确定时,也比较困难。
所以在实际应用时,应针对具体定时精度的要求,采取相适应的定时方法。
VC中提供了很多关于时间操作的函数,利用它们控制程序能够精确地完成定时和计时操作。
方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。
这种定时方法非常简单,可以实现一定的定时功能,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,最小计时精度仅为30ms,CPU占用低,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应用。
只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。
方式二:VC中使用sleep()函数实现延时,它的单位是ms,如延时2秒,用sleep(2000)。
精度非常低,最小计时精度仅为30ms,用sleep函数的不利处在于延时期间不能处理其他的消息,如果时间太长,就好象死机一样,CPU占用率非常高,只能用于要求不高的延时程序中。
方式三:利用COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程来实现秒级延时。
以下是实现2秒的延时代码:ColeDateTime start_time = COleDateTime::GetCurrentTime();COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time;while( end_time.GetTotalSeconds() < 2 ) // 实现延时2秒{MSG msg;GetMessage(&msg,NULL,0,0);TranslateMessage(&msg);DispatchMessage(&msg);//以上四行是实现在延时或定时期间能处理其他的消息,//虽然这样可以降低CPU的占有率,//但降低了延时或定时精度,实际应用中可以去掉。
VC中使用定时器的方法
VC中使用定时器的方法1.启用一个定时器直接调用函数:SetTimer(1,500,NULL);//定义时钟1,时间间隔为500ms SetTimer(2,1000,NULL);//定义时钟2,时间间隔为1000ms 可以在按钮按下时启用定时器:void CTimeDlg::OnButton1(){// TODO: Add your control notification handler code hereSetTimer(1,500,NULL);//定义时钟1,时间间隔为500ms SetTimer(2,1000,NULL);//定义时钟2,时间间隔为1000ms }2.关闭定时器:可以在按钮中调用如下函数关闭某定时器: void CTimeDlg::OnButton2(){// TODO: Add your control notification handler code hereKillTimer(1); //关闭1号定时器KillTimer(2); //关闭2号定时器}3.添加定时器时间到的处理代码:1)在开发界面中Ctrl+W 进入MFCclass wizard页面2)选择Message Maps选项卡3)在Project中选择你的工程4)在object Ids:中选择C…..Dlg5)在Messages:中选择WM_TIMER,此时,Member functions 中自动定位到: W OnTimer ON_WM_TIMER,6) 单击EDIT code(或双击W OnTimer ON_WM_TIMER)自动进入如下函数:void CTimeDlg::OnTimer(UINT nIDEvent) {// TODO: Add your message handler code here and/or call defaultswitch(nIDEvent){case 1: //1号定时器应该处理的事情//…..break;case 2: //2号定时器应该处理的事情//…..break;}CDialog::OnTimer(nIDEvent); //此句VC自动生成}。
c定时器
onTimer(nIDEvent)
{
switch(nIDEvent)
{
case 1:........;
break;
case 2:.......;
break;
case 3:......;
再看看OnTimer()
CWnd::OnTimer
afx_msg void OnTimer(UINT nIDEvent);
ontimer() 是响应CWnd对象产生的WM_Timer消息。nIDEvent表示要响应TIMER事件的ID。
vc++中定时器的使用
SetTimer函数的用法
1 )用WM_TIMER来设置定时器
先请看SetTimer这个API函数的原型
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
二. 或许你会问,如果我要加入两个或者两个以上的 timer怎么办?
继续用SetTimer函数吧,上次的timer的ID是1,这次可以是2,3,4。。。。
SetTimer(2,1000,NULL);
SetTimer(3,500,NULL);
嗯,WINDOWS会协调他们的。当然onTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码:
Windows提供了定时器,帮助我们编写定期发送消息的程序。定时器一般通过一下两中方式通知应用程序间隔时间已到。
⑴ 给指定窗口发送WM_TIMER消息,也就是下面的给出在窗口类中使用的方法。
⑵ 调用一个应用程序定义的回调函数,也就是在非窗口类中使用方法。
VC中定时器用法
方法一:调用SetTimer时指定窗口句柄hWnd,nIDEvent中指定计时器ID,将lpTimerFunc置NULL从而不使用TimerProc;在窗口过程中处理WM_TIMER消息。调用KillTimer时,使用SetTimer中指定的hWnd和id。最好使用#define定义timer的id,例如:
#define ID_TIMER 1
SetTimer(hWnd,ID_TIMER,1000,NULL) ;
KillTimer(hWnd,ID_TIMER) ;
方法二:调用SetTimer时指定窗口句柄hWnd,nIDEvent中指定计时器ID,lpTimerFunc参数不为NULL而指定为TimerProc函数的指针。这种方法使用TimerProc函数(名字可自定)处理WM_TIMER消息:
SetTimer(hWnd,ID_TIMER,1000,TimerProc) ;
KillTimer(hWnd,ID_TIMER) ;
方法三:调用SetTimer时不指定窗口句柄(为NULL),iTimerID参数自然被忽略,lpTimerFunc不为NULL而指定为TimerProc的指针。正如上面SetTimer的讨论中所说的,此时SetTimer的返回值正是新建立的计时器的ID,需将这个ID保存以供KillTimer销毁计时器时所用。当然,KillTimer的hWnd参数也置为NULL。这种方法同样用TimerProc处理WM_TIMER消息。
uElapse是以毫秒指定的计时间隔值,范围为1毫秒到4,294,967,295毫秒(将近50天),这个值指示Windows每隔多久时间给程序发送WM_TIMER消息。
lpTimerFunc是一个回调函数的指针,俗称TimerFunc;如果lpTimerFunc为NULL,系统将向应用程序队列发送WM_TIMER消息;如果lpTimerFunc指定了一个值,DefWindowProc将在处理WM_TIMER消息时调用这个lpTimerFunc所指向的回调函数,因此即使使用TimerProc代替处理WM_TIMER也需要向窗口分发消息。
WINCE无窗口程序使用定时器.
WINCE无窗口程序使用定时器.对于WINCE下有窗口的程序,可以通过简单的使用API SetTimer来创建一个定时器。
当定时器超时时窗口会收到一个WM_TIMER消息,我们在WM_TIMER消息中去做定时器超时处理即可。
而对于无窗口的程序,因为本身没有消息循环,所以无法收到WM_TIMER消息,定时器也就无法正常工作了。
那么无窗口程序如何通过SetTimer来定时呢?其实我们只需在无窗口程序里的主线程中加一个消息循环,来处理WM_TIMER即可,参考代码如下:[cpp] view plaincopyprint?1.UINT uTimerID = ::SetTimer(NULL,NULL,1000,NULL);2.MSG msg;3.//消息循环4.while (GetMessage(&msg, NULL, 0, 0))5.{6.switch(msg.message)7.{8.case WM_QUIT:9.:KillTimer(NULL,uTimerID);10.break;11.case WM_TIMER:12.//TODO:Treat WM_TIMER message13.break14.default:15.break;16.}17.}18.}但对于无窗口的程序这样还是比较麻烦的,使用定时器的时候还得添加消息循环的代码,其实微软还提供了一个API timeSetEvent来创建定时器,已实现更精确的定时,参考代码如下:[cpp] view plaincopyprint?1.// 需要引入的头文件和库2.#include <mmsytem.h>3.#pragma comment(lib,"mmtimer.lib")4.// 定时器回调函数5.void CALLBACK TrayKeyProc(UINT wTimerID,UINT msg,D WORD dwUser,DWORD dw1,DWORD dw2);6.// 创建定时器7.MMRESULT uTimerID = timeSetEvent(1000,1,TimerProc,( DWORD)this,TIME_PERIODIC | TIME_CALLBACK_FUNCTION);8.9.// 定时器超时处理10.void CALLBACK TimerProc(UINT wTimerID,UINT msg,D WORD dwUser,DWORD dw1,DWORD dw2)11.{12.// TODO:Place Code here13.}最后别忘了调用timeKillEvent关闭定时器。
VC++中使用定时器的方法
1.启用一个定时器直接调用函数:SetTimer(1,500,NULL);//定义时钟1,时间间隔为500ms SetTimer(2,1000,NULL);//定义时钟2,时间间隔为1000ms 可以在按钮按下时启用定时器:void CTimeDlg::OnButton1(){// TODO: Add your control notification handler code hereSetTimer(1,500,NULL);//定义时钟1,时间间隔为500ms SetTimer(2,1000,NULL);//定义时钟2,时间间隔为1000ms }2.关闭定时器:可以在按钮中调用如下函数关闭某定时器: void CTimeDlg::OnButton2(){// TODO: Add your control notification handler code hereKillTimer(1); //关闭1号定时器KillTimer(2); //关闭2号定时器}3.添加定时器时间到的处理代码:1)在开发界面中Ctrl+W 进入MFCclass wizard页面2)选择Message Maps选项卡3)在Project中选择你的工程4)在object Ids:中选择C…..Dlg5)在Messages:中选择WM_TIMER,此时,Member functions中自动定位到: W OnTimer ON_WM_TIMER,6) 单击EDIT code(或双击W OnTimer ON_WM_TIMER)自动进入如下函数:void CTimeDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultswitch(nIDEvent){case 1: //1号定时器应该处理的事情//…..break;case 2: //2号定时器应该处理的事情//…..break;}CDialog::OnTimer(nIDEvent); //此句VC自动生成}秘密在VC中,定时有三种方法,一是利用WM_TIMER消息的API函数,二是使用多媒体定时器,三是多线程定时器(不知道是不是可以这样分啊)。
VC多个定时器的使用
多个定时器的使用作者:xujian本文适合初学者下载源代码大小:11K一、定时器的基本使用方法在编程时,会经常使用到定时器。
使用定时器的方法比较简单,通常告诉W INDOW S一个时间间隔,然后W INDOW S以此时间间隔周期性触发程序。
通常有两种方法来实现:发送W M_TIMER消息和调用应用程序定义的回调函数。
1.1 用W M_TIMER来设置定时器先请看SetTimer这个AP I函数的原型UINT_PTR SetTimer(HWND hWnd, // 窗口句柄UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器UINT uElapse, // 时间间隔,单位为毫秒TIMERPROC lpTimerFunc // 回调函数);例如SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器如:UINT SetTimer(1,100,NULL);函数反回值就是第一个参数值1,表示此定时器的ID号。
第二个参数表示要等待100毫秒时间再重新处理一次。
第三个参数在这种方法中一般用NULL。
注意:设置第二个参数时要注意,如果设置的等待时间比处理时间短,程序就会出问题了。
1.2 调用回调函数此方法首先写一个如下格式的回调函数void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。
二、多个定时器的实现与应用我们在安装定时器时都为其指定了ID,使用多个定时器时,该ID就发挥作用了。
使用MFC时就更简单了,我们为其增加W M_TIME的消息处理函数OnT imer即可,请看如下例子void CTimerTestDlg::OnTimer(UINT nIDEvent){switch (nIDEvent){case 24: ///处理ID为24的定时器Draw1();break;case 25: ///处理ID为25的定时器Draw2();break;}CDialog::OnTimer(nIDEvent);}例如: void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime){switch(nTimerid){case 1: ///处理ID为1的定时器Do1();break;case 2: ///处理ID为2的定时器Do2();break;}}三、取消定时器不再使用定时器后,我们应该调用K illT imer来取消定时,K illT imer的原型如下BOOL KillTimer(HWND hWnd, // 窗口句柄UINT_PTR uIDEvent // ID);在MFC程序中我们可以直接调用K illT imer(int n IDEv ent)来取消定时器。
VC++游戏编程之定时器
一、定时器事实上游戏本身几乎都是以无限循环的方式不断地在游戏窗口进行窗口画面的重绘操作,即使画面没有任何变化,这个重绘的操作还是会不断地进行,一直到游戏结束为止。
这一节将介绍如何利用WINDOWS本身的定时器及游戏中常用的游戏循环来制作游戏的动态效果。
Timer定时器对象可以再每隔一段时间发出一个WM_TIMER时间消息,程序收到消息后,就可以执行一些操作。
比如,可以设置定时器来播放静态的连续图片,就可以产生动画效果。
这也是通常显示动画的一种方式。
Windows API中有这样的函数:SetTimer()为我们定义一个定时器。
函数原型:1. UINT_PTR SetTimer(2. HWND hWnd, // 窗口句柄3. UINT_PTR nIDEvent, // 定时器代号4. UINT uElapse, // 时间设定的值,单位为毫秒5. TIMERPROC lpTimerFunc // 定时器响应函数6. );这里举一个小例子:1. SetTimer(hwnd, // 窗口句柄2. IDT_TIMER1, // 代号3. 10000, // 10秒4. (TIMERPROC) NULL); // 没有响应函数5.6. SetTimer(hwnd,7. IDT_TIMER2,8. 5000,9. (TIMERPROC) NULL);10.11. c ase WM_TIMER:12. switch (wParam)13. {14. case IDT_TIMER1:15. // 执行10秒的操作16. return 0;17. case IDT_TIMER2:18. // 执行5秒的操作19. return 0;20. }创建后自然需要删除定时器。
KillTimer()就是用来终止某个定时器的1. BOOL KillTimer(2. HWND hWnd, // 窗口句柄3. UINT_PTR uIDEvent // 定时器代号4. );运用定时器使预先做好的连续的静态图片播放,形成动画的效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二个参数表示要等待100毫秒时间再重新处理一次。第三个参数在这种方法中一般用NULL。
注意:设置第二个参数时要注意,如果设置的等待时间比处理时间短,程序就会出问题了。
2 调用回调函数
此方法首先写一个如下格式的回调函数
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);
VC++ WM_TIMER 定时器使用方法
在编程时,会经常使用到定时器。使用定时器的方法比较简单,通常告诉Windows一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。
一、WM_TIMER定时器的实现与应用
然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。
二、多个定时器的实现与应用
我们在安装定时器时都为其指定了ID,使用多个定时器时,该ID就发挥作用了。
不使用MFC时,当接收到WM_TIMER消息,WPARAM wParam中的值便是该定时器的ID
break;
case 25: ///处理ID为25的定时器
Draw2();
break;
}
CDialog::OnTimer(nIDEvent);
}
当你用回调函数时,我们可以根据nTimerid的值来判断是哪个定时器,例如:
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
不再使用定时器后,我们应该调用KillTimer来取消定时,KillTimer的原型如下
BOOL KillTimer(
HWND hWnd, // 窗口句柄
UINT_PTR uIDEvent // ID
);
在MFC程序中我们可以直接调用KillTimer(int nIDEvent)来取消定时器。
使用MFC时就更简单了,我们为其增加WM_TIME的消息处理函数OnTimer即可,请看如下例子
void CTimerTestDlg::OnTimer(UINT nIDEvent)
{
switch (nIDEvent)
{
case 24: ///处理ID为24的定时器
Draw1();
{
switch(nTimerid)
{
case 1: ///处理ID为1的定时器
Do1();
break;
case 2: ///处理ID为2的定时器
Do2();
break;
}
}
三、取消定时器
TIMERPROC lpTimerFunc // 回调函数
);
例如 SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了,例如:
UINT SetTimer(1,100,NULL);
1 用WM_TIMER来设置定时器 先请看SBiblioteka tTimer这个API函数的原型
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
如:KillTimer(1);