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

合集下载

定时器1秒代码c语言

定时器1秒代码c语言

定时器1秒代码c语言1. 概述在计算机编程中,定时器是一个非常常见的工具。

它可以帮助程序员实现一些特定的功能,比如定时执行某个任务或者控制代码执行时间。

本文将介绍如何使用C语言实现一个简单的定时器。

2. 定时器基本原理在计算机编程中,定时器的基本原理是利用系统的时钟来计算经过的时间。

操作系统会维护一个内部的时钟计数器,每隔一段时间就会进行一次计数。

通过判断计数器的值,程序可以知道当前经过的时间。

3. 实现定时器在C语言中,可以使用time.h头文件中的函数实现定时器功能。

以下是一个简单的定时器实现的代码示例:```cinclude <stdio.h>include <time.h>int main(){int count = 0;time_t start_time = time(NULL);while (1){time_t current_time = time(NULL);int diff_time = current_time - start_time;if (diff_time >= 1){count++;start_time = current_time;printf("count = %d\n", count);}}return 0;}```在上述代码中,我们使用了time.h头文件中的函数time()获取当前的系统时间。

程序会在while循环中不断地获取当前时间并计算时间差,当时间差达到1秒时,程序会对计数器进行自增,并输出计数器的值。

由于每隔1秒钟会触发一次输出,所以计数器count的值就成为了一个简单的定时器。

4. 定时器的应用在实际应用中,定时器有着广泛的应用场景。

下面我们简单介绍几个常见的例子。

4.1. 利用定时器实现闹钟功能我们可以通过设置定时器来实现闹钟的功能。

具体步骤如下:1. 获取当前系统时间;2. 计算目标时间和当前时间的差值,得到定时器时长;3. 开启定时器;4. 在定时器结束时触发替换铃声的操作。

vs timers用法

vs timers用法

vs timers用法VS Timers是Visual Studio IDE的一个插件,它提供了一种简单的方法来创建和管理定时器。

使用VS Timers可以轻松地创建和调试Windows Forms和WPF应用程序中的定时器,而无需编写大量的代码。

以下是VS Timers的基本用法:1. 安装VS Timers插件,打开Visual Studio IDE。

2. 在工具栏中选择“VS Timers”选项卡,点击“添加定时器”按钮。

3. 在出现的对话框中设置定时器的时间间隔、名称和描述等参数。

4. 在代码中调用定时器,可以使用以下代码示例:```csharpprivate void Form1_Load(object sender, EventArgs e){// 创建定时器并设置时间间隔Timer timer = new Timer();timer.Interval = 1000;// 绑定事件处理程序timer.Tick += new EventHandler(timer_Tick);// 启动定时器timer.Start();}private void timer_Tick(object sender, EventArgs e){// 在这里添加定时器处理代码}```上述代码示例创建了一个名为“timer”的定时器,并设置了时间间隔为1秒。

在事件处理程序“timer_Tick”中添加了处理逻辑。

VS Timers提供了一种方便的方式来创建和管理Windows Forms和WPF应用程序中的定时器,可以帮助开发人员更快速地实现定时器功能。

VC定时器SetTimer函数

VC定时器SetTimer函数

VC定时器SetTimer函数一、SetTim er表示的是定义个定时器。

根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTim er事件,这样,就可以相应事件了。

SetTim er有两个函数。

①一个是全局的函数::SetTim er()UINT SetTim er(HWND hWnd, // handle of window for tim er m essagesUINT nIDEvent, // tim er identifierUINT uElapse, // tim e-out valueTIMERPROC lpTim erFunc // address of tim er procedure);其中hWnd 是指向CWnd的指针,即处理Tim er事件的窗口类。

因此继承CWnd的子类均可以定义SetTim er事件。

②SetTim er() 在CWnd中也有定义,即SetTim er()是CWnd的一个成员函数。

CWnd的子类可以调用该函数,来设置触发器。

UINT SetTim er(UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTim er)(HWND, UINT, UINT, DWORD) );参数含义:nIDEvent:是指设置这个定时器的iD,即身份标志,这样在OnTim er()事件中,才能根据不同的定时器,来做不同的事件响应。

这个ID是一个无符号的整型。

nElapse是指时间延迟。

单位是毫秒。

这意味着,每隔nElapse毫秒系统调用一次Ontim er()。

void (CALLBACK EXPORT* lpfnTim er)(HWND, UINT, UINT, DWORD)Specifies the address of the application-supplied Tim erProc callback function that processes the WM_TIMER m essages. If this param eter is NULL, the WM_TIMER m essages are placed in the application’s m essage queue and handled by the CWnd object。

C语言中如何获取毫秒级和微秒级时间

C语言中如何获取毫秒级和微秒级时间

C语言中如何获取毫秒级和微秒级时间在C语言中,获取毫秒级和微秒级时间通常需要使用系统提供的函数库来实现。

下面将介绍两种常用的方法。

clock(函数可以返回程序执行起点到调用时所使用的处理器时钟计时单元(即时钟周期数),而CLOCKS_PER_SEC常量表示每秒钟的处理器时钟计时单元数。

具体步骤如下:
5. 计算执行时间(毫秒):`double milliseconds =
(double)duration / (double)CLOCKS_PER_SEC * 1000.0;`
需要注意的是,该方法的精度取决于操作系统提供的时钟精度。

常见的操作系统时钟精度为10毫秒,因此该方法一般只能达到10毫秒级别的精度。

具体步骤如下:
5.计算程序执行的时间差值:
6. 计算执行时间(毫秒):`double milliseconds = seconds * 1000.0 + microseconds / 1000.0;`
综上所述,以上两种方法分别适用于需求不同的情况。

如果要求较高的时间测量精度,推荐使用第二种方法。

单片机C语言编程中定时器初值计算的两种方法

单片机C语言编程中定时器初值计算的两种方法

单片机C语言编程中定时器初值计算的两种方法在单片机C语言编程中,定时器的初值计算是一个重要的环节。

定时器的初值是一个整数值,用于设置定时器的计数范围和计数周期。

根据不同的需求和硬件平台,可以采取不同的方法来计算定时器的初值。

1.基于精确的时间计算方法:基于精确的时间计算方法主要是根据需要定时的时间长度来计算定时器的初值。

首先,需要确定定时器的频率,即每秒钟产生的中断次数。

然后,需要计算出所需的计数周期,即需要定时的时间长度乘以定时器的频率。

最后,通过计算周期与定时器的初始值之间的关系,可以得到定时器的初值。

基于精确的时间计算方法能够保证定时器的精度,在需要精确控制时间的应用中比较常见。

2.基于试验和估算的方法:基于试验和估算的方法适用于一些不需要非常精确的定时器应用。

这种方法一般通过实验来确定合适的定时器初值。

首先,设置一个初值,然后通过实际运行代码并观察计时结果,不断调整初值,直到达到所需的定时效果。

例如,在一个LED闪烁的应用中,假设希望每个LED的亮灭时间为1秒。

可以通过设置一个初值,然后不断调整初值,直到每个LED的亮灭时间接近1秒。

在调整初值时,可以通过观察LED亮灭的频率来判断初值是否合适。

基于试验和估算的方法相对简单,适用于一些对定时器精度要求不高的应用。

需要注意的是,在定时器初值的计算过程中,需要考虑定时器的工作模式、预分频系数等因素,以确保定时器的计时周期和频率能够满足要求。

在单片机C语言编程中,定时器的初值计算是一个重要而复杂的任务。

根据不同的应用需求和硬件平台,可以选择不同的计算方法。

基于精确的时间计算方法适用于那些对定时器精度有较高要求的应用,而基于试验和估算的方法适用于一些对定时器精度要求不高的应用。

无论选用哪种方法,在计算定时器初值时,需要充分考虑定时器的工作模式、频率和计时周期等因素,以确保定时器的计时与实际需求相符。

同时,在实际应用中,定时器初值也可能需要通过实验和调试进行调整,以保证定时器的工作效果。

关于vc++时间函数的总结

关于vc++时间函数的总结

MFC提供了两个日期和时间类CTime和CTimeSpan,分别代表相对时间和绝对时间。

CTime是基于格林威治平均时间(GMT)的,本地的时间由环境变量TZ决定。

CTimeSpan代表了时间间隔。

CTime类由下列成员函数:CTime()创建一个CTime对象。

GetCurrentTime()由当前时间创建一个CTime对象。

GetTime()由CTime对象返回一个time_t变量。

GetYear()获取CTime对象代表的年。

GetMonth()获取CTime对象代表的月。

GetDay() 获取CTime对象代表的日期。

GetHour() 获取CTime对象代表的小时。

GetMinute()获取CTime对象代表的分。

GetSecond() 获取CTime对象代表的秒。

GetDayOfWeek() 获取CTime对象代表的周日,1代表周日,2代表周-等等。

Format() 将字符串转换成一个基于本地时区的格式字符串。

FormatGmt() 将字符串转换成一个基于UTC(世界时)的格式字符串。

operator = 赋予新的时间。

operator + 增加CTime和CTimeSpan对象。

operator –减小CTime和CTimeSpan对象。

operator += CTime对象加一个CTimeSpan对象。

operator -= CTime对象减一个CTimeSpan对象。

operator == 比较两个绝对时间是否相等。

operator != 比较两个绝对时间是否不相等。

operator < 比较两个绝对时间,是否前一个大于后一个。

operator > 比较两个绝对时间,是否前一个小于后一个。

operator >= 比较两个绝对时间,是否前一个大于等于后一个。

operator <= 比较两个绝对时间,是否前一个小于等于后一个。

把收获总结如下:首先看几个函数的原型的声明(在time.h中):clock_t clock( void ) clock_t是用来保存时间的数据类型,是long 型double difftime(time_t time1, time_t time0); 取时间间隔的函数time_t time(time_t * timer); 日历时间函数char * asctime(const struct tm * timeptr); 将tm 类的时间结构转化为固定时间格式char * ctime(const time_t *timer); 将日历时间转化为固定时间格式time_t mktime(struct tm * timeptr); 以年、月、日、时、分、秒等分量保存的时间结构struct tm * gmtime(const time_t *timer); 将日历时间转化为格林尼治时间struct tm * localtime(const time_t * timer); 将日历时间转化为当地时间tm 的定义:struct tm {int tm_sec; /* 秒–取值区间为[0,59] */int tm_min; /* 分- 取值区间为[0,59] */int tm_hour; /* 时- 取值区间为[0,23] */int tm_mday; /* 一个月中的日期- 取值区间为[1,31] */int tm_mon; /* 月份(从一月开始,0代表一月)- 取值区间为[0,11] */int tm_year; /* 年份,其值等于实际年份减去1900 */int tm_wday; /* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推*/int tm_yday; /* 从每年的1月1日开始的天数–取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推*/int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。

VC七种计时方法

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;

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语言中的定时器算法是一种常用的计算机编程技术,可以用于实现定时任务、倒计时、延时等功能。

c中timer的用法

c中timer的用法

c中timer的用法c中timer的用法的用法你知道吗?下面小编就跟你们详细介绍下c中timer的用法的用法,希望对你们有用。

c中timer的用法的用法如下:关于C#中timer类在C#里关于定时器类就有3个1.定义在System.Windows.Forms里2.定义在System.Threading.Timer类里3.定义在System.Timers.Timer类里System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API SetTimer实现的。

它的主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台应用程序)无法使用。

System.Timers.Timer和System.Threading.Timer非常类似,它们是通过.NET Thread Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。

System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。

它们的缺点是不支持直接的拖放,需要手工编码。

例:使用System.Timers.Timer类//实例化Timer类,设置间隔时间为10000毫秒;System.Timers.Timer t = new System.Timers.Timer(10000);//到达时间的时候执行事件;t.Elapsed += new System.Timers.ElapsedEventHandler(theout);t.AutoReset = true;//设置是执行一次(false)还是一直执行(true);t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;====================================自己写的一个用System.Timer类的方法复制代码代码如下:public class BF_CheckUpdate{private static object LockObject = new Object();// 定义数据检查Timerprivate static Timer CheckUpdatetimer = new Timer();// 检查更新锁private static int CheckUpDateLock = 0;////// 设定数据检查Timer参数///internal static void GetTimerStart(){// 循环间隔时间(10分钟)CheckUpdatetimer.Interval = 600000;// 允许Timer执行CheckUpdatetimer.Enabled = true;// 定义回调CheckUpdatetimer.Elapsed += new ElapsedEventHandler(CheckUpdatetimer_Elapsed);// 定义多次循环CheckUpdatetimer.AutoReset = true;}////// timer事件/////////private static void CheckUpdatetimer_Elapsed(object sender, ElapsedEventArgs e){// 加锁检查更新锁lock (LockObject){if (CheckUpDateLock == 0) CheckUpDateLock = 1; else return;}//More code goes here.//具体实现功能的方法Check();// 解锁更新检查锁lock (LockObject){CheckUpDateLock = 0;}}}。

VC++获取系统时间、程序运行时间(精确到秒,毫秒)的五种方法

VC++获取系统时间、程序运行时间(精确到秒,毫秒)的五种方法

VC++获取系统时间、程序运⾏时间(精确到秒,毫秒)的五种⽅法1.使⽤CTime类(获取系统当前时间,精确到秒)CString str;//获取系统时间CTime tm;tm=CTime::GetCurrentTime();//获取系统⽇期str=tm.Format("现在时间是%Y年%m⽉%d⽇ %X");MessageBox(str,NULL,MB_OK);a,从CTimet中提取年⽉⽇时分秒CTime t = CTime::GetCurrentTime(); int d=t.GetDay(); //获得⼏号 int y=t.GetYear(); //获取年份 int m=t.GetMonth(); //获取当前⽉份 int h=t.GetHour(); //获取当前为⼏时 int mm=t.GetMinute(); //获取分钟 int s=t.GetSecond(); //获取秒 int w=t.GetDayOfWeek(); //获取星期⼏,注意1为星期天,7为星期六b,计算两段时间的差值,可以使⽤CTimeSpan类,具体使⽤⽅法如下:CTime t1( 1999, 3, 19, 22, 15, 0 );CTime t = CTime::GetCurrentTime();CTimeSpan span=t-t1; //计算当前系统时间与时间t1的间隔int iDay=span.GetDays(); //获取这段时间间隔共有多少天int iHour=span.GetTotalHours(); //获取总共有多少⼩时int iMin=span.GetTotalMinutes();//获取总共有多少分钟int iSec=span.GetTotalSeconds();//获取总共有多少秒c,获得当前⽇期和时间,并可以转化为CStringCTime tm=CTime::GetCurrentTime();CString str=tm.Format("%Y-%m-%d");//显⽰年⽉⽇2.使⽤GetLocalTime:Windows API 函数,获取当地的当前系统⽇期和时间(精确到毫秒) 此函数会把获取的系统时间信息存储到SYSTEMTIME结构体⾥边typedef struct _SYSTEMTIME{WORD wYear;//年WORD wMonth;//⽉WORD wDayOfWeek;//星期:0为星期⽇,1为星期⼀,2为星期⼆……WORD wDay;//⽇WORD wHour;//时WORD wMinute;//分WORD wSecond;//秒WORD wMilliseconds;//毫秒}SYSTEMTIME,*PSYSTEMTIME;例:SYSTEMTIME st;CString strDate,strTime;GetLocalTime(&st);strDate.Format("%4d-%2d-%2d",st.wYear,st.wMonth,st.wDay);strTime.Format("%2d:%2d:%2d",st.wHour,st.wMinute,st.wSecond) ;AfxMessageBox(strDate);AfxMessageBox(strTime);3.使⽤GetTickCount:从操作系统启动到现在所经过(elapsed)的毫秒数,它的返回值是DWORD。

Visual+C++实现微秒级精度定时器

Visual+C++实现微秒级精度定时器

Visual C++实现微秒级精度定时器在工产控制系统中,有许多需要定时完成的操作,如:定时显示当前时间,定时刷新屏幕上的进度条,上位机定时向下位机发送命令和传送数据等。

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

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

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

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

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

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

本实例实现了一中微秒级的精确定时,程序的界面提供了两个"Edit"编辑框,其中一个编辑框输入用户理想的定时长度,另外一个编辑框返回实际的时间长度,经过大量的实验测试,一般情况下误差不超过5个微秒。

程序的运行界面如图一所示:图一、实现微秒级的精确定时器一、实现方法Visual C++中提供了很多关于时间操作的函数,利用它们控制程序能够精确地完成定时和计时操作。

Visaul C++中的WM_TIMER消息映射能进行简单的时间控制。

首先调用函数Se tTimer()设置定时间隔(退出程序时别忘了调用和SetTimer()配对使用的KillTimer ()函数),如SetTimer(0,200,NULL)即为设置200ms的时间间隔。

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

这种定时方法非常简单,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。

C语言如何获得精确到毫秒的时间

C语言如何获得精确到毫秒的时间

C语⾔如何获得精确到毫秒的时间在做测试或性能优化时,经常要知道程序运⾏的时间,在Linux系统可以使⽤time命令来计算程序运⾏运⾏所消耗的时间,能精确到毫秒,如果要精确到代码块或某个操作运⾏时所消耗的时间,time命令就不给⼒了。

如果对时间的精度要求不⾼的话,可以调⽤标准C的接⼝time 来得到开始和结束的时间,再调⽤difftime接⼝来计算时间差,精度是秒,代码如下所⽰:#include <stdio.h>#include <time.h>int main(){time_t t_start, t_end;t_start = time(NULL) ;sleep(3000);t_end = time(NULL) ;printf("time: %.0f s\n", difftime(t_end,t_start)) ;return 0;}如果要让程序休眠3秒,Windows使⽤Sleep(3000),Linux使⽤sleep(3),即Windows的Sleep接⼝的参数的单位是毫秒,Linux的sleep接⼝的参数的单位是秒。

如果需要精确到毫秒,以上程序就发挥不了作⽤,如果在Java要达到这要求就很简单了,代码如下所⽰:public class Time {public static void main(String[] args) {try {long startTime = System.currentTimeMillis();Thread.sleep(3000);long endTime = System.currentTimeMillis();System.out.println("time: " + (endTime - startTime) + " ms");} catch (InterruptedException e) {e.printStackTrace();}}}通过Google找了⼀些资料后,发现C语⾔⾥没有标准的接⼝可以获得精确到毫秒的时间,都会调⽤到与操作系统相关的API,下⾯会分别介绍在Linux和Windows系统下的多种实现⽅法,希望对⼤家有帮助。

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函数,二是使用多媒体定时器,三是多线程定时器(不知道是不是可以这样分啊)。

Windows下的精确定时器

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

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++ SetTimer函数的用法

vc++ SetTimer函数的用法

SetTimer函数的用法1 )用WM_TIMER来设置定时器先请看SetTimer这个API函数的原型UINT_PTR SetTimer(HWND hWnd, // 窗口句柄UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器UINT uElapse, // 时间间隔,单位为毫秒TIMERPROC lpTimerFunc // 回调函数);例如SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了于是SetTimer函数的原型变为:UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))当使用SetTimer函数的时候,就会生成一个计时器。

函数中nIDEvent指的是计时器的标识,也就是名字。

nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。

第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认认的是onTime函数。

这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。

然后在函数里添加代码,让代码实现功能。

每隔一段时间就会自动执行一次。

例:SetTimer(1,1000,NULL);1:计时器的名称;1000:时间间隔,单位是毫秒;NULL:使用onTime函数。

当不需要计时器的时候调用KillTimer(nIDEvent);例如:KillTimer(1);2)调用回调函数此方法首先写一个如下格式的回调函数void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。

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++中获取UTC时间精确到微秒的实现代码

C++中获取UTC时间精确到微秒的实现代码

C++中获取UTC时间精确到微秒的实现代码在⽇常开发过程中经常会使⽤到时间类函数的统计,其中获取1970年⾄今的UTC时间是⽐较常使⽤的,但是在windows下没有直接能够精确到微妙级的函数可⽤。

本⽂提供⽅法正好可以解决这类需求问题。

下⾯先给出:复制代码代码如下:#ifndef UTC_TIME_STAMP_H_#define UTC_TIME_STAMP_H_#include <windows.h>#include <sys/timeb.h>#include <time.h>#if !defined(_WINSOCK2API_) && !defined(_WINSOCKAPI_)struct timeval{long tv_sec;long tv_usec;};#endifstatic int gettimeofday(struct timeval* tv){union {long long ns100;FILETIME ft;} now;GetSystemTimeAsFileTime (&now.ft);tv->tv_usec = (long) ((now.ns100 / 10LL) % 1000000LL);tv->tv_sec = (long) ((now.ns100 - 116444736000000000LL) / 10000000LL);return (0);}//获取1970年⾄今UTC的微妙数static time_t TimeConversion::GetUtcCaressing(){timeval tv;gettimeofday(&tv);return ((time_t)_sec*(time_t)1000000+_usec);}#endif接下来给出:timeval tv;gettimeofday(&tv);或者直接调⽤:GetUtcCaressing();本⽂代码在vs2008与VS2010下都进⾏了测试,可放⼼使⽤附录:本⽂同时给出UTC时间秒级UTC获取⽅法代码:复制代码代码如下:time_t timep;struct tm *p;time(&timep);p=localtime(&timep);timep = mktime(p);printf("%d\n",timep);。

c++微秒级计时+对拍+随机数

c++微秒级计时+对拍+随机数

c++微秒级计时+对拍+随机数调⽤了c++11加⼊的chrono库和命名空间⼤部分内容来⾃这篇注意如果你直接这么写你会发现⽤纳秒级的代码实际上的精度是0.1微秒这是因为在Windows下system_clock只有这个精度所以如果想做到真正的1ns需要⽤high_resolution_clockupd:high_resolution_clock并没有什么⽤可以⽤steady c lock代替,虽然效果差不多当然你⽤linux的话请⽆视上⾯那⼏句话其实还可以把nanoseconds换成更⼩的,不过操作系统精度不够,并没有什么⽤#include<cstdio>#include<chrono>#include<cstdlib>//⽤万能头也⾏using namespace std;using namespace chrono;int main(){for(register int i=1;;++i){system("data.exe > in.txt");auto s=system_clock::now();system("std.exe < in.txt > stdout.txt");auto t=system_clock::now();system("test.exe < in.txt > testout.txt");auto t2=system_clock::now();auto duration1=duration_cast<microseconds>(t-s);auto duration2=duration_cast<microseconds>(t2-t);double time1=(double)(duration1.count())/1000;double time2=(double)(duration2.count())/1000;if(system("fc /W stdout.txt testout.txt > nul")){printf("point #%d\nWA time used: std %.3fms test %.3lfms\n",i,time1,time2);break;}else printf("point #%d\nAC time used: std %.3fms test %.3lfms\n",i,time1,time2);}system("pause>nul");return 0;}随机数⽣成(windows下(因为linux不需要这样),c++11以上)#define seed 19491001//随意std::mt19937 rng(seed^std::chrono::steady_clock::now().time_since_epoch().count()); template<class T>inline T rand(T l,T r){return std::uniform_int_distribution<T>(l,r)(rng);//均匀分布}Processing math: 100%。

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

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

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

众所周知,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占用率非常高,只能用于要求不高的延时程序中。

如示例工程中的Timer2。

方式三:利用COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程来实现秒级延时。

如示例工程中的Timer3和Timer3_1。

以下是实现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的占有率,//但降低了延时或定时精度,实际应用中可以去掉。

end_time =COleDateTime::GetCurrentTime()-start_time;}//这样在延时的时候我们也能够处理其他的消息。

方式四:在精度要求较高的情况下,VC中可以利用GetTickCount()函数,该函数的返回值是 DWORD型,表示以ms为单位的计算机启动后经历的时间间隔。

精度比WM_TIMER消息映射高,在较短的定时中其计时误差为15ms,在较长的定时中其计时误差较低,如果定时时间太长,就好象死机一样,CPU占用率非常高,只能用于要求不高的延时程序中。

如示例工程中的Timer4和Timer4_1。

下列代码可以实现50ms的精确定时:DWORD dwStart = GetTickCount();DWORD dwEnd = dwStart;do{dwEnd = GetTickCount()-dwStart;}while(dwEnd <50);为使GetTickCount()函数在延时或定时期间能处理其他的消息,可以把代码改为:DWORD dwStart = GetTickCount();DWORD dwEnd = dwStart;do{MSG msg;GetMessage(&msg,NULL,0,0);TranslateMessage(&msg);DispatchMessage(&msg);dwEnd = GetTickCount()-dwStart;}while(dwEnd <50);虽然这样可以降低CPU的占有率,并在延时或定时期间也能处理其他的消息,但降低了延时或定时精度。

方式五:与GetTickCount()函数类似的多媒体定时器函数DWORD timeGetTime(void),该函数定时精度为ms级,返回从Windows启动开始经过的毫秒数。

微软公司在其多媒体Windows中提供了精确定时器的底层API持,利用多媒体定时器可以很精确地读出系统的当前时间,并且能在非常精确的时间间隔内完成一个事件、函数或过程的调用。

不同之处在于调用DWORD timeGetTime(void) 函数之前必须将Winmm.lib 和Mmsystem.h 添加到工程中,否则在编译时提示DWORD timeGetTime(void)函数未定义。

由于使用该函数是通过查询的方式进行定时控制的,所以,应该建立定时循环来进行定时事件的控制。

如示例工程中的Timer5和Timer5_1。

方式六:使用多媒体定时器timeSetEvent()函数,该函数定时精度为ms级。

利用该函数可以实现周期性的函数调用。

如示例工程中的Timer6和Timer6_1。

函数的原型如下:MMRESULT timeSetEvent(UINT uDelay,UINTuResolution,LPTIMECALLBACKlpTimeProc,WORD dwUser,UINT fuEvent )该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。

事件一旦被激活,便调用指定的回调函数,成功后返回事件的标识符代码,否则返回NULL。

函数的参数说明如下:uDelay:以毫秒指定事件的周期。

Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。

缺省值为1ms。

LpTimeProc:指向一个回调函数。

DwUser:存放用户提供的回调数据。

FuEvent:指定定时器事件类型:TIME_ONESHOT:uDelay毫秒后只产生一次事件TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。

具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在LpTimeProc回调函数中(如:定时采样、控制等),从而完成所需处理的事件。

需要注意的是,任务处理的时间不能大于周期间隔时间。

另外,在定时器使用完毕后,应及时调用timeKillEvent()将之释放。

方式七:对于精确度要求更高的定时操作,则应该使用QueryPerformanceFrequency()和 QueryPerformanceCounter()函数。

这两个函数是VC提供的仅供Windows95及其后续版本使用的精确时间函数,并要求计算机从硬件上支持精确定时器。

如示例工程中的Timer7、Timer7_1、Timer7_2、Timer7_3。

QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型如下:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount);数据类型ARGE_INTEGER既可以是一个8字节长的整型数,也可以是两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而定。

该类型的定义如下:typedef union _LARGE_INTEGER{struct{DWORD LowPart ;// 4字节整型数LONG HighPart;// 4字节整型数};LONGLONG QuadPart ;// 8字节整型数}LARGE_INTEGER ;在进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率,然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经历的精确时间。

下列代码实现1ms的精确定时:LARGE_INTEGER litmp;LONGLONG QPart1,QPart2;double dfMinus, dfFreq, dfTim;QueryPerformanceFrequency(&litmp);dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率QueryPerformanceCounter(&litmp);QPart1 = litmp.QuadPart;// 获得初始值do{QueryPerformanceCounter(&litmp);QPart2 = litmp.QuadPart;//获得中止值dfMinus = (double)(QPart2-QPart1);dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒}while(dfTim<0.001);其定时误差不超过1微秒,精度与CPU等机器配置有关。

下面的程序用来测试函数Sleep(100)的精确持续时间:LARGE_INTEGER litmp;LONGLONG QPart1,QPart2;double dfMinus, dfFreq, dfTim;QueryPerformanceFrequency(&litmp);dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率QueryPerformanceCounter(&litmp);QPart1 = litmp.QuadPart;// 获得初始值Sleep(100);QueryPerformanceCounter(&litmp);QPart2 = litmp.QuadPart;//获得中止值dfMinus = (double)(QPart2-QPart1);dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒由于Sleep()函数自身的误差,上述程序每次执行的结果都会有微小误差。

相关文档
最新文档