VC中使用定时器的方法

合集下载

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自动生成}秘密在VC中,定时有三种方法,一是利用WM_TIMER消息的API函数,二是使用多媒体定时器,三是多线程定时器(不知道是不是可以这样分啊)。

VC++中通过SetTimer函数创建并使用定时器

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函数了。

vc++实现非窗口类中使用定时器的方法

vc++实现非窗口类中使用定时器的方法

vc++实现非窗口类中使用定时器的方法2010-09-17 21:44:35| 分类:默认分类| 标签:非窗口回调函数|字号大中小订阅定时器在视窗系统的程式中的作用不可忽略,也随处可见。

设定一个时间间隔每0.5秒或1秒钟刷新一次时钟,这样就能完成一个简单的电子钟程式。

在不同的编程工具中定时器的用法也不同,Visual C++中也给我们提供了实现这种功能的方法,而且方法不只一种。

在窗口类中是使用定时器比较简单,用SetTimer()设置了定时器之后,并在Class Wizard中添加了WM_TIMER消息映射后,你就能在映射函数OnTimer()中添加代码实现,来定时完成你的任务,而且还支持任意多个定时器,这种方法大家可能都会用。

不过在非窗口的类中,使用定时器就没那么简单了,在类消息映射中就未找到OnTimer()方法了,类中也没有hWnd 这个属性,SetTimer()也不能象原来那样使用了,下面给出了一种既不破坏类的完整性的同时又能巧妙的使用定时器的方法。

一、实现方法在非窗口类中使用定时器,需要了解的知识比较多。

首先非窗口类中没有消息映射,也没有象CWnd 类具有的SetTimer()方法来设置定时器。

没有消息映射,就只能靠我们自己定义的回调函数来处理定时器的消息,因此大家有必要了解一下回调函数的概念。

因为回调函数只能用全局函数或静态成员函数来实现,而为了维持类的完整性,又需求使用类的静态成员函数来作为回调函数,所以我们又需要了解一下静态数据成员和静态成员函数的性质。

又因为定时器是在我们的程式中产生的,这又需要来管理定时器,所以又用到了映射表类CMap,因此介绍一下CMap的简单用法也是必不可少的。

所谓回调函数就是按照一定的形式由研发人员定义并编写实现内容,当发生某种事件时由系统或其他函数来调用的函数。

使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己编写的一个函数(也就是回调函数)的地址作为参数传递给那个函数。

VC环境下C语言定时器的使用

VC环境下C语言定时器的使用

VC环境下C语言定时器的使用当前的rae终端软件是用vc开发的,源文件中既有C++又有C。

C++的定时器使用SetTimer,该定时器需要消息机制来触发;C中的定时器依赖于不同的操作系统(多数C语言编译器不支持多线程,而且ANSI C也没有线程库,因此C语言无法实现实际意义上的定时器(即包含触发机制的定时器)),在vxworks中可用watchdog,而在windows下,SetTimer的使用依赖于消息循环,因此最好使用自定义的timer。

在自己所了解的C语言软件框架中,都使用了自定义的timer。

例如,7号信令,trillium中都是在一个独立的线程中处理与定时有关的操作。

当定时器超时,根据指针函数调用相应的回调函数。

以下所列为从网上摘抄的简单例子。

timer.h#ifndef __TIMER_H__#define __TIMER_H__typedef void (*timer_callback)(void *);typedef struct timer * timer;#define TIMER_INACTIVE 0x00000000UL#define TIMER_ACTIVE 0x00000001ULunsigned long timer_init( void );timer timer_create( const char * name, timer_callbackcb, void * param, unsigned long ticks, unsigned long remain, unsigned long status );void timer_del( timer *tp );unsigned long timer_task_del( void );#endif /*__TIMER_H__*/timer.c#include <windows.h>#include "timer.h"struct timer {struct timer * next;struct timer * prev;LPCSTR timer_name;LPVOID timer_param;ULONG timer_id;ULONG timer_counts;ULONG timer_remain;ULONG timer_status;timer_callback tcb;};static timer timer_head = NULL;static HANDLE hTimer = 0;static DWORD dwTimer = 0;static BOOL flag = TRUE;#define INT_DISABLE#define INT_ENABLEstatic timer timer_find( timer tp ){timer p = timer_head;timer rp = NULL;while ( p ) {if ( p->next == tp ) { rp = p;break;}p = p->next;}return rp;}static void timer_add( timer tp ){timer p = timer_find( NULL );if ( p == NULL ){timer_head = tp;return;}else{p->next = tp;p->next->prev = p;}}void timer_del( timer *tp ){timer p = *tp;if ( ( tp == NULL ) || ( *tp == NULL ) ) {return;}if ( p->prev ) {p->prev->next = p->next;}else {timer_head = p->next;}if ( p->next ) {p->next->prev = p->prev;}free( p );*tp = NULL;}DWORD WINAPI timer_task( LPVOID param ){timer p = NULL;while ( flag ) {Sleep( 10 );p = timer_head;while ( p ) {if ( ( p->timer_status & TIMER_ACTIVE ) && ( !--p->timer_remain ) ) {p->timer_remain = p->timer_counts;(p->tcb)(p->timer_param);}p = p->next;}}return 0;}unsigned long timer_init( void ){hTimer = CreateThread( NULL, 0, timer_task, NULL, 0, &dwTimer );if ( hTimer == NULL ) {return 0;}return 1;}unsigned long timer_task_del( void ){timer p = NULL;timer tp = NULL;if ( hTimer != NULL ) {flag = FALSE;WaitForSingleObject( hTimer, INFINITE ); CloseHandle( hTimer );hTimer = NULL;dwTimer = 0;}p = timer_head;while ( p ) {tp = p->next;free( p );p = tp;}timer_head = NULL;return 1;}timer timer_create( const char * name, timer_callbackcb, void * param, unsigned long ticks, unsigned long remain, unsigned long status ){timer p = NULL;p = malloc( sizeof( struct timer ) ); if ( p != NULL ) {p->next = NULL;p->prev = NULL;p->tcb = cb;p->timer_param = param;p->timer_counts = ticks;p->timer_remain = remain;p->timer_status = status;p->timer_name = name;timer_add( p );}return p;}test.c#include <windows.h>#include <stdio.h>#include "timer.h"void ctimer_expire( void * p ){printf( "ctimer_expire\n" );}void ptimer_expire( void * p ){printf( "ptimer_expire\n" );}void ttimer_expire( void * p ){printf( "ttimer_expire\n" );}void main(){timer ctimer = NULL;timer ptimer = NULL;timer ttimer = NULL;timer_init();ctimer = timer_create( "ctimer_expire", ctimer_expi re, NULL, 100, 100, TIMER_ACTIVE );ptimer = timer_create( "ptimer_expire", ptimer_expi re, NULL, 30, 30, TIMER_ACTIVE );ttimer = timer_create( "ttimer_expire", ttimer_expi re, NULL, 20, 20, TIMER_ACTIVE );while ( 1 ){Sleep(1000);}timer_task_del();}以下为依赖于消息机制的SetTimer的用法:#include <windows.h>#include <iostream>using namespace std;const UINT uiTimerID = 10;VOID CALLBACK FooTimerFun( HWND, UINT, UINT, DWORD ){static int nCount = 0;cout << "Timer Function , nCount = " << nCount ++ << endl;if( nCount > 5 )PostQuitMessage(0);}int main(){MSG msg;SetTimer(NULL, uiTimerID, 1000, FooTimerFun);while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg); DispatchMessage(&msg); }KillTimer(NULL, uiTimerID);return 0;}特别声明:1:资料来源于互联网,版权归属原作者2:资料内容属于网络意见,与本账号立场无关3:如有侵权,请告知,立即删除。

VC6的定时器

VC6的定时器

VC6的定时器VC6的定时器一般在类的Oncreate()函数中设置,格式为SetTimer(),如SetTimer(m_hWnd,1,1000,NULL),其中m_hWnd 代替定时器的名称,1秒触发一次的定时器发出消息,这个消息被消息函数ontimer()捕捉,然后执行里面的代码。

一般用完定时器后在类的OnDestroy()中就把它干掉,如KillTimer(0)。

0代表定时器的名称。

有了定时器,我们就可以做出很多种动画效果,做动画一般是使它的窗口区无效,重新连续的绘制。

典型的是在Ontimer()函数中加入Invalidate(FALSE),它代表整个窗口客户区无效,需要重绘。

int CMy3DCBDSView::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;Init();SetTimer(0,20,NULL);return 0;}void CMy3DCBDSView::OnDestroy(){Release();KillTimer(0);CView::OnDestroy();}void CMy3DCBDSView::OnTimer(UINT nIDEvent) {if(nIDEvent==0)//定时器名称{if(ang_e>=360.0f){ang_e=0.0f;}else{ang_e=ang_e+1.0f;}if(ang_m>=360.0f){ang_m=0.0f;}else{ang_m=ang_m+12.3687513f;//地球公转一度月球公转12.3687513度}}Invalidate(FALSE);//窗口客户区无效,重绘,刷新屏幕CView::OnTimer();}。

c标准库定时器函数

c标准库定时器函数

C标准库定时器函数==========在C标准库中,定时器函数提供了一种在特定时间间隔后触发事件或者在某个时间点执行特定任务的能力。

以下是一些主要的C标准库定时器函数及其功能:1. 创建/删除定时器-----------* `timer_create`:此函数用于创建一个新的定时器。

它需要一个`timer_t`类型的变量来存储定时器的标识符,一个`struct sigevent`结构体来指定定时器的回调函数和参数,以及一个`timer_attr_t`类型的变量来指定定时器的属性。

* `timer_delete`:此函数用于删除一个已创建的定时器。

它需要一个`timer_t`类型的变量来存储定时器的标识符。

2. 定时器控制--------* `timer_settime`:此函数用于设置定时器的运行参数,包括定时器的标识符、定时器类型(周期性或单次)、回调函数、回调函数的参数、初试时间、间隔时间等。

* `timer_gettime`:此函数用于获取定时器的当前状态,包括定时器的标识符、当前时间、剩余时间等。

3. 定时器回调--------* `timer_cb`:此函数是定时器的回调函数,它会在定时器触发时被调用。

在回调函数中,您可以执行任何需要在特定时间执行的任务。

4. 定时器状态获取----------* `timer_status`:此函数用于获取定时器的状态,包括定时器的标识符、当前时间、剩余时间、状态标志等。

这些函数的使用需要结合具体的程序设计和需求来进行。

使用这些函数时需要注意错误处理和异常情况的处理,以确保程序的稳定性和可靠性。

VC高精度多媒体定时器的使用

VC高精度多媒体定时器的使用
timeGetSystemTime, timeGetTime, timeSetEvent,timeKillEvent ,midiOutShortMsg, midiOutLongMsg,OutputDebugString。同时也不要使用完成时间很
长的 API 函数,程序尽可能简短。
使用以上一组函数就可以完成毫秒级精度的计时和控制(在 C++Builder 中使用时要将 头文件 mmsystem.h 加到程序中)。由于将定时控
该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一 旦被激活,便调用指定的回调函数,成功后返回事件的标识符代码,否则返回 NULL。参数 说明如下:
uDelay:以毫秒指定事件的周期。 UResolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为 1ms。 LpTimeProc:指向一个回调函数。 DwUser:存放用户提供的回调数据。 FuEvent:指定定时器事件类型: TIME_ONESHOT:uDelay 毫秒后只产生一次事件 TIME_PERIODIC :每隔 uDelay 毫秒周期性地产生事件。
22 g_wTimerID = timeSetEvent(6, wTimerRes, (LPTIMECALLBACK)SendFun, (DWORD )this, TIME_PERIODIC);
23 if(g_wTimerID == 0)
24
return false;
25
26 return true;
/******************************************************************\ function name : CreateTimer desc : create a realtime timer argument void ret code [HANDLE] ,the handle of the timer

c语言 定时器算法

c语言 定时器算法

c语言定时器算法一、概述定时器算法是一种常用的计算机编程技术,用于在特定的时间间隔内执行特定的任务。

在C语言中,可以使用定时器算法来实现定时任务、倒计时、延时等功能。

本文档将介绍C语言中常用的定时器算法,包括定时器的基本概念、定时器的实现方式以及定时器的应用场景。

二、基本概念定时器是一种用于控制时间间隔的设备或技术。

在计算机编程中,定时器通常用于在特定的时间间隔内执行特定的任务。

定时器的精度和范围取决于所使用的硬件和软件实现。

三、实现方式C语言中实现定时器的方式有多种,其中常见的方法包括:1.查询式定时器:通过查询定时器标志位的方式来实现定时器功能。

这种方式简单易行,但是精度较低,不适合需要高精度的应用场景。

2.滴答定时器:操作系统通常会提供滴答定时器,可以自动计算时间间隔并执行相应的任务。

这种方式精度较高,但是需要操作系统支持。

3.循环延时:通过循环语句来实现延时功能,通过控制循环次数来控制时间间隔。

这种方式简单易行,但是延时精度和范围有限。

4.信号量+循环延时:使用信号量来控制定时器的执行次数,通过循环延时来实现定时功能。

这种方式精度较高,适用于需要精确控制时间间隔的应用场景。

四、应用场景定时器算法在许多应用场景中都有应用,例如:1.游戏计时器:在游戏中使用定时器算法可以精确控制游戏时间,实现倒计时、时间流逝等功能。

2.定时任务:通过定时器可以实现定时执行任务的功能,例如每天自动备份数据、定期清理过期文件等。

3.延时控制:在需要精确控制时间间隔的场合,如数字信号处理、通信协议等,可以使用定时器算法来实现。

4.程序调试:在调试程序时,可以使用定时器来控制程序的执行过程,观察程序的运行状态和结果。

五、代码示例以下是一个简单的C语言代码示例,使用循环延时来实现一个定时器:```c#include<stdio.h>#include<stdlib.h>#include<unistd.h>//用于循环延时函数sleep()intmain(){intcount=10;//定时时间间隔,单位为秒while(count>0){printf("Timer:%dsecondsremaining\n",count);sleep(1);//控制时间间隔为1秒的延时函数count--;}printf("Timerfinished\n");return0;}```六、总结C语言中的定时器算法是一种常用的计算机编程技术,可以用于实现定时任务、倒计时、延时等功能。

VC多个定时器的使用

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中定时

如何在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++中使用定时器的方法

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定时器的用法实例详解

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的第⼀个参数设置成它⾃⼰的句柄⽽已。

VC中定时器用法

VC中定时器用法

关于WM_TIMER消息
wParam为计时器的ID;如果需要设定多个计时器,那么对每个计时器都使用不同的计时器ID。wParam的值将随传递到窗口过程中的WM_TIMER消息的不同而不同。
lParam为指向TimerProc的指针,如果调用SetTimer时没有指定TimerProc(参数值为NULL),则lParam为0(即NULL)。
关于SetTime建立的timer的ID,如果hWnd非NULL,返回一个非0整数,如果SetTimer调用失败则返回0
KillTimer的函数原型为:BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent ) ; 参数意义同SetTimer。
#define ID_TIMER 1
SetTimer(hWnd,ID_TIMER,1000,NULL) ;
KillTimer(hWnd,ID_TIMER) ;
方法二:调用SetTimer时指定窗口句柄hWnd,nIDEvent中指定计时器ID,lpTimerFunc参数不为NULL而指定为TimerProc函数的指针。这种方法使用TimerProc函数(名字可自定)处理WM_TIMER消息:
可见,计时器并不能严格按照指定的时间间隔发送WM_TIMER消息,它总要相差那么几毫秒。
即使忽略这几个毫秒的差别,计时器仍然不精确。请看原因二:
WM_TIMER消息放在正常的消息队列之中,和其他消息排列在一起,因此,如果在SetTimer中指定间隔为1000毫秒,那么不能保证程序每1000毫秒或者989毫秒就会收到一个WM_TIMER消息。如果其他程序的执行事件超过一秒,在此期间内,您的程式将收不到任何WM_TIMER讯息。事实上, Windows对WM_TIMER消息的处理非常类似于对WM_PAINT消息的处理,这两个消息都是低优先级的,程序只有在消息队列中没有其他消息时才接收它们。

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自动生成}秘密在VC中,定时有三种方法,一是利用WM_TIMER消息的API函数,二是使用多媒体定时器,三是多线程定时器(不知道是不是可以这样分啊)。

VC实现微秒级的精确定时器

VC实现微秒级的精确定时器

在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位机定时向下位机发送命令和传送数据等。

特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要精确定时操作。

众所周知,Windows是基于消息机制的系统,任何事件的执行都是通过发送和接收消息来完成的。

这样就带来了一些问题,如一旦计算机的CPU被某个进程占用,或系统资源紧张时,发送到消息队列中的消息就暂时被挂起,得不到实时处理。

因此,不能简单地通过Windows消息引发一个对定时要求严格的事件。

另外,由于在Windows中已经封装了计算机底层硬件的访问,所以,要想通过直接利用访问硬件来完成精确定时,也比较困难。

所以在实际应用时,应针对具体定时精度的要求,采取相适应的定时方法。

VC中提供了很多关于时间操作的函数,利用它们控制程序能够精确地完成定时和计时操作。

本文详细介绍了 VC中基于Windows的精确定时的七种方式:方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。

首先调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔。

然后在应用程序中增加定时响应函数 OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间的操作。

这种定时方法非常简单,可以实现一定的定时功能,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,最小计时精度仅为30ms,CPU占用低,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应用。

只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。

如示例工程中的Timer1。

方式二:VC中使用sleep()函数实现延时,它的单位是ms,如延时2秒,用sleep(2000)。

精度非常低,最小计时精度仅为30ms,用sleep函数的不利处在于延时期间不能处理其他的消息,如果时间太长,就好象死机一样,CPU占用率非常高,只能用于要求不高的延时程序中。

VC中实现毫秒定时器

VC中实现毫秒定时器

VC中实现毫秒定时器很久之前就想给Vckbase写点什么东西了,毕业至今,在vckbase中学了不少东西,也拿了不少代码,今天决定要回报一下,不管老婆呆会会不会拧我耳朵了。

毫秒定时器,为什么要使用毫秒定时器呢?我想原因有两个。

第一:CWnd 里面的timer不能精确到毫秒级,所以必须要写一个精确到毫秒级的。

第二:用CWnd里面的timer代价太大,因为有时我们的类根本就没有窗口,为了使用timer,而不得不从CWnd里派生。

本人写的这个mmtimer,主要是为了解决上面这两点而设计的。

再加上,这段时间看了一下设计模式,所以基本上这些代码是我这几个月来设计模式的总结,如果写得不好,敬请各位大虾指教。

运行结果如下:图一毫秒定时器好了我们先来看看实现毫秒定时器的关键技术吧。

其实异常的简单,主要用到如下几个函数,(见代码中CMMTimers)1) timeGetDevCaps,得到当前计算机的时间精度。

2) timeBeginPeriod,设定当前定时器的精确度。

例如设定为5,表示误差不会大于5毫秒。

3) timeEndPeriod. 跟2相对应,结束了定时精度.(其实我的这些代码中有没有这三个函数,效果也是一样的)4) timeSetEvent(...pfn...).开始定时,该函数中,有一个参数时回调函数指针,以及回调函数的参数,我的代码中是internalTimerProc,和m_Recoder[MMRecoder::nRes](该参数指明定时器ID,一个CMMTimers的指针)5)timeKillEvent.终止定时器。

如果对上述函数不理解也没关系,我已经把它们封装成一个类了,对了就叫CMMTimers.为了使你不必去理解上述这些函数,我作出封装,CMMTimers主要有如下几个函数接口:1)bool stopTimer(int nTimerID) 作用跟KillTimer(int nTimerID) 一样.2)bool startTimer(UINT period,CTimerListener *pListener = NULL,int nTimerID = 1,bool oneShot = FALSE);相当于SetTimer(int nTimerID).nTimerID,就是定时器ID,oneShot就是是否只运行一次,你可能会说CTimerListener是个什么东西,这个下面我再解释。

VC中使用定时器的方法

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自动生成}。

Vc++6.0 定时器的创建和关闭

Vc++6.0  定时器的创建和关闭

Vc++6.0 定时器的创建和关闭如下实现的是:在工程运行后,每5秒定时弹出一个MessageBox窗口MFC工程dialog中的使用:(工程创建:打开VC6.0---菜单file---new---projects----MFC AppWizard(exe) 工程命名为:XS )*****************在进入Dialog画面时,设置定时器::SetTimer(~~~~~~)*****************如下是在CXSDlg类中成员函数OnInitDialog设置************************** CXSDlg::OnInitDialog函数里{::SetTimer(this->hWnd,8,5000,NULL) //(this->hWnd为当前Dialog)(8为ID)(5000为5秒),NULL~~~~~ return TRUE;}***********以下:菜单view---ClassWizard---会弹出一个MFC ClassWizard画面,在画面Messages:中找到WM_TIMER选中后---MFC ClassWizard画面右手边单击Add Function---单击下面的Edit Codes************************************ 此后会进入到:void CTestkbDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call default //在这里写入每一段时间里你想实现的代码就可以,现在,我只实现弹出“你好!XS”MessageBox("你好!XS");CDialog::OnTimer(nIDEvent);}**************************************运行试试看~~你会发现,一进入介面,就每5秒弹出一个窗口“你好!XS”************************如果你想实现按下一个控件BUTTEN来实现定时器,可以把::SetTimer(this->hWnd,8,5000,NULL) 这个写入到你的BUTTEN控件函数中,就可以实现,记住,在用完Timer定时器后用KillTimer()把定时器关掉o(^_^)o*************************************************** ******************************************************* **************************************************** **************************最后,如果你不是用ClassWizard来创建OnTimer()函数,而是自己创建:1. CXSDlg.h文件中,写入afx_msg void OnTimer(UINT nIDEvent);声明的,2. CXSDlg.cpp文件:写入OnTimer()函数代码段的,3. 记得也要在CXSDlg.cpp文件中的如下位置写入 ON_WM_TIMER():~~~~~~~~~~~~~~~~~~~~~~~~~~~~BEGIN_MESSAGE_MAP(CTestkbDlg, CDialog)//{{AFX_MSG_MAP(CTestkbDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_TIMER()//}}AFX_MSG_MAPEND_MESSAGE_MAP()。

c定时执行方法

c定时执行方法

c定时执行方法
C语言中可以使用定时器进行定时执行方法。

定时器是一种能够定期产生中断信号的硬件或软件设备,可以在规定的时间间隔内执行某些任务。

在C语言中,可以使用对应的函数库来实现定时器的功能。

其中,常见的函数库包括:signal、setitimer、alarm等。

signal函数可以设置信号处理函数,当某个特定信号被触发时,会执行对应的处理函数。

可以利用signal函数设置定时器,通过定时触发特定的信号,来实现周期性执行某个任务的功能。

setitimer函数可以设置一个定时器,并启动其计时功能。

该函数需要传递一个结构体类型的参数,包含了定时器的关键信息,如定时器类型、超时时间、重复计时周期等。

setitimer函数会启动一个定时器,当达到超时时间时会触发一个信号,可以利用signal函数设置其相应的处理函数,从而实现定时任务的执行。

alarm函数可以设置指定时间后的闹钟信号,并返回当前闹钟信号触发的时间值。

可以利用该函数来实现周期性执行某个任务的功能,当闹钟信号触发时,可以执行对应的任务,并重新设置下一个周期的闹
钟信号。

总的来说,定时器可以帮助我们实现某些周期性任务的自动化执行。

C 语言提供了多种函数库和方法来实现定时器的功能,开发人员可以根据自己的实际需求和环境选择合适的方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.启用一个定时器直接调用函数:
SetTimer(1,500,NULL);//定义时钟1,时间间隔为500ms SetTimer(2,1000,NULL);//定义时钟2,时间间隔为1000ms 可以在按钮按下时启用定时器:
void CTimeDlg::OnButton1()
{
// TODO: Add your control notification handler code here
SetTimer(1,500,NULL);//定义时钟1,时间间隔为500ms SetTimer(2,1000,NULL);//定义时钟2,时间间隔为1000ms }
2.关闭定时器:可以在按钮中调用如下函数关闭某定时器: void CTimeDlg::OnButton2()
{
// TODO: Add your control notification handler code here
KillTimer(1); //关闭1号定时器
KillTimer(2); //关闭2号定时器
}
3.添加定时器时间到的处理代码:
1)在开发界面中Ctrl+W 进入MFCclass wizard页面2)选择Message Maps选项卡
3)在Project中选择你的工程
4)在object Ids:中选择C…..Dlg
5)在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 default
switch(nIDEvent)
{
case 1: //1号定时器应该处理的事情
//…..
break;
case 2: //2号定时器应该处理的事情
//…..
break;
}
CDialog::OnTimer(nIDEvent); //此句VC自动生成
}。

相关文档
最新文档