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函数创建并使用定时器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++实现非窗口类中使用定时器的方法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语言定时器的使用当前的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的定时器一般在类的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标准库定时器函数及其功能: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高精度多媒体定时器的使用

长的 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语言中实现定时器的方式有多种,其中常见的方法包括: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语言中的定时器算法是一种常用的计算机编程技术,可以用于实现定时任务、倒计时、延时等功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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自动生成
}。