经典问题,时钟组件vue 调用组件方法的是哪个函数是settimer还是timeSetEvent

推荐这篇日记的豆列
&&&&&&&&&&&&介绍&&&&&&&&我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执 行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者 算法的运行时间。编译器和操作系统为我们提供了很多时间函数,这些时间函数的精度也是各不相同的,所以,如果我们想得到准确的结果,必须使用合适的时间函 数。现在我就介绍windows下的几种常用时间函数。&1&:&Sleep&函数&使用:&sleep(1000),在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟;Linux下表示1000秒,Linux下使用毫秒级别的函数可以使用usleep。&原理:&sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。Sleep函数并不能起到定时的作用,主要作用是延时。在一些多线程中可能会看到sleep(0);其主要目的是让出时间片。&精度:&sleep函数的精度非常低,当系统越忙它精度也就越低,有时候我们休眠1秒,可能3秒后才能继续执行。它的精度取决于线程自身优先级、其他线程的优先级,以及线程的数量等因素。&2&:&MFC&下的&timer&事件&&&&&&&&使用:&1.调用函数SetTimer()设置定时间隔,如SetTimer(0,100,NULL)即为设置100毫秒的时间间隔;2.在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成时间到时的操作。&&&&&原理:&同sleep函数一样。不同的是timer是一个定时器,可以指定回调函数,默认为OnTimer()函数。&&&&&精度:&timer事件的精度范围在毫米级别,系统越忙其精度也就越差。&3&:&C&语言下的&Time&&&&&&&&使用:&time_time(&t);Time函数是获取当前时间。&&&&&原理:&time函数主要用于获取当前时间,比如我们做一个电子时钟程序,就可以使用此函数,获取系统当前的时间。&&&&&精度:&秒级别&4&:COM对象中的&COleDateTime&,&COleDateTimeSpan&类&&&&&使用:&COleDateTime start_time = COleDateTime::GetCurrentTime();&COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_While(end_time.GetTotalSeconds() & 2){// 处理延时或定时期间能处理其他的消息DoSomething()end_time = COleDateTime::GetCurrentTime-start_&}&原理:&以上代表延时2秒,而这两秒内我们可以循环调用DoSomething(),从而实现在&延时的时候我们也能够处理其他的函数,或者消息。&COleDateTime,COleDateTimeSpan&是&MFC&中&CTime&,&CTimeSpan&在&COM&中的应用,所以,上面的方法对于&CTime&,&CTimeSpa&同样有效。&&&&&&&&精度:&秒级别&5&:&C&语言下的时钟周期&clock()&&&&&&&&使用:&&&&clock_t start = clock();&&&& &&&&&&&& Sleep(100);&&&& &&&&&&&& clock_t end = clock();&&&& &&&&&double&d = (double&)(start - end) / CLOCKS_PER_SEC;&&&&&&&&原理:&clock()是获取计算机启动后的时间间隔。&精度:&ms级别,对于短时间内的定时或者延时可以达到ms级别,对于时间比较长的定时或者延迟精度还是不够。在windows下CLOCKS_PER_SEC为1000。&6&:&Windows&下的&GetTickCount()&使用:&DWORD start = GetTickCount();&&&&&&& Sleep(100);&&&&&&& DWORD end = GetTickCount();&原理:&GetTickCount()是获取系统启动后的时间间隔。通过进入函数开始定时,到退出函数结束定时,从而可以判断出函数的执行时间,这种时间也并非是函数或者算法的真实执行时间,因为在函数和算法线程不可能一直占用CPU,&对于所有判断执行时间的函数都是一样,&不过基本上已经很准确,可以通过查询进行定时。&GetTickCount()&和&Clock()&函数是向主板&BIOS&要&real time clock&时间,会有中断产生,以及延迟问题。&精度:&WindowsNT 3.5以及以后版本精度是10ms,它的时间精度比clock函数的要高,GetTickCount()常用于多媒体中。&7&:&Windows&下timeGetTime&使用:&需要包含&Mmsystem.h&,&Windows.h&,加入静态库&Winmm.lib.&timeBeginPeriod(1);DWORD start = timeGetTime();&&&& &&&&&&&& Sleep(100);&&&& &&&& DWORD end = timeGetTime();&timeEndPeriod(1);&原理:&timeGetTime&也时常用于多媒体定时器中,可以通过查询进行定时。通过查询进行定时,本身也会影响定时器的定时精度。&精度:&毫秒&,与GetTickCount()相当。但是和GetTickCount相比,timeGetTime可以通过timeBeginPeriod,timeEndPeriod设置定时器的最小解析精度, timeBeginPeriod,timeEndPeriod必须成对出现。&8&:windows下的&timeSetEvent&使用:还记的VC下的Timer吗?Timer是一个定时器,而以上我们提到几种时间函数或者类型,实现定时功能只能通过轮训来实现,也就是必须另外创建一个线程单独处理,这样会影响定时精度,好在windows提供了内置的定时器timeSetEvent,函数原型为&MMRESULT timeSetEvent&( UINT uDelay, //&以毫秒指定事件的周期&UINT uResolution, //&以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms&LPTIMECALLBACK lpTimeProc, //&指向一个回调函数&WORD dwUser, //&存放用户提供的回调数据&UINT fuEvent&)//&标志参数,TIME_ONESHOT:执行一次;TIME_PERIODIC:周期性执行&&&&&&&&具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在 lpFunction回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是:任务处理的时间不能大于周期间隔时间。另外,在定时器 使用完毕后,应及时调用timeKillEvent()将之释放。&原理:&可以理解为代回调函数的timeGetTime&精度:&毫秒&,timeSetEvent可以通过timeBeginPeriod,timeEndPeriod设置定时器的最小解析精度, timeBeginPeriod,timeEndPeriod必须成对出现。&9&:高精度时控函数&QueryPerformanceFrequency&,&QueryPerformanceCounter&使用:&LARGE_INTEGER m_nF&&&& &&&& LARGE_INTEGER m_nBeginT&&&& &&&& LARGE_INTEGER nEndT&&&& &&&& QueryPerformanceFrequency(&m_nFreq);&//&获取时钟周期&&&&& &&&& QueryPerformanceCounter(&m_nBeginTime);&//&获取时钟计数&&&&& &&&& Sleep(100);&&&& &&&& QueryPerformanceCounter(&nEndTime);&&&& cout && (nEndTime.QuadPart-m_nBeginTime.QuadPart)*1000/m_nFreq.QuadPart &&&原理:&CPU上也有一个计数器,以机器的clock为单位,可以通过rdtsc读取,而不用中断,因此其精度与系统时间相当。&精度:&计算机获取硬件支持,精度比较高,可以通过它判断其他时间函数的精度范围。&10&小结:&以上提到常用的9种时间函数,由于他们的用处不同,所以他们 的精度也不尽相同,所以如果简单的延时可以用sleep函数,稍微准确的延时可以使用clock函数,GetTickCount函数,更高级的实用 timeGetTime函数;简单的定时事件可以用Timer,准确地可以用timeSetEvent;或取一般系统时间可以通time,或者 CTime,或者COleDateTime,获取准确的时间可以用clock,或者GetTickCount函数,或者timeGetTime函数,而获 取准确地系统时间要使用硬件支持的QueryPerformanceFrequency函数,QueryPerformanceCounter函数。
http://blog.csdn.net/adcxf/article/details/5288912
Views(...) Comments()资料,文献
&&&&&& 我们在一个函数运行时间,或者判断一个的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者算法的运行时间。编译器和为我们提供了很多时间函数,这些时间函数的精度也是各不相同的,所以,如果我们想得到准确的结果,必须使用合适的时间函数。现在我就介绍windows下的几种常用时间相关函数。
1:Sleep函数
使用:sleep(1000),在Windows和下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟;Linux下表示1000秒,Linux下使用毫秒级别的函数可以使用usleep。定义在windows.h头文件中。
原理:sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。Sleep函数并不能起到定时的作用,主要作用是延时。在一些多线程中可能会看到sleep(0);其主要目的是让出时间片。
精度:sleep函数的精度非常低,当系统越忙它精度也就越低,有时候我们休眠1秒,可能3秒后才能继续执行。它的精度取决于线程自身优先级、其他线程的优先级,以及线程的数量等因素。
2:MFC下的timer事件
&&&&&& 使用:1.调用函数SetTimer()设置定时间隔,如SetTimer(0,100,NULL)即为设置100毫秒的时间间隔;2.在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成时间到时的操作。
&&& 原理:同sleep函数一样。不同的是timer是一个定时器,可以指定回调函数,默认为OnTimer()函数。
&&& 精度:timer事件的精度范围在毫米级别,系统越忙其精度也就越差。
3:下的time
&&&&&& 使用:time_ &time(&t); time函数是获取当前时间。定义在time.h头文件中。他获取当前的系统时间,接受time_t类型的指针参数,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated
Universal Time)时间日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。然后可调用将CUT时间转换为本地时间(我们是+8区,比CUT多8个小时)并转成struct
tm类型,接收time_t类型的指针,返回struct tm类型的指针,该类型的各数据成员分别表示年月日时分秒。最后可以调用asctime函数将struct tm类型对象转换成string类型对象,他接收struct tm类型的指针,返回string类型的对象,表示着当地的年月日时间。
&&& 原理:time函数主要用于获取当前时间,比如我们做一个电子时钟程序,就可以使用此函数,获取系统当前的时间。
&&& 精度:秒级别
& & 例子:
&#include&string&
#include&time.h&
#include&iostream&
using std::
using std::
using std::
void main()
struct tm* tm_
tm_time=localtime(&t);
string s_time=asctime(tm_time);
cout&&&Time is: &&&s_time&&
4:COM对象中的COleDateTime,COleDateTimeSpan类
&&& 使用:
COleDateTime start_time = COleDateTime::GetCurrentTime();
COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_
While(end_time.GetTotalSeconds() & 2)
// 处理延时或定时期间能处理其他的消息
DoSomething()
end_time = COleDateTime::GetCurrentTime-start_
原理:以上代表延时2秒,而这两秒内我们可以循环调用DoSomething(),从而实现在延时的时候我们也能够处理其他的函数,或者消息。COleDateTime,COleDateTimeSpan是MFC中CTime,CTimeSpan在COM中的应用,所以,上面的方法对于CTime,CTimeSpa同样有效。
&&&&&& 精度:秒级别
5:C语言下的时钟周期clock()
&&&&&& 使用:&&
clock_t start = clock();
Sleep(100);
clock_t end = clock();
double d = (double)(start - end) / CLOCKS_PER_SEC;
&&&&&& 原理:clock()是获取计算机启动后的时间间隔。
精度:ms级别,对于短时间内的定时或者延时可以达到ms级别,对于时间比较长的定时或者延迟精度还是不够。在windows下频率CLOCKS_PER_SEC为1000。
6:Windows下的GetTickCount()
DWORD start = GetTickCount();
Sleep(100);
DWORD end = GetTickCount();
GetTickCount()是获取系统启动后的时间间隔。通过进入函数开始定时,到退出函数结束定时,从而可以判断出函数的执行时间,这种时间也并非是函数或者算法的真实执行时间,因为在函数和算法线程不可能一直占用CPU,对于所有判断执行时间的函数都是一样,不过基本上已经很准确,可以通过查询进行定时。GetTickCount()&和Clock()函数是向主板BIOS要real
time clock时间,会有中断产生,以及延迟问题。
精度:WindowsNT 3.5以及以后版本精度是10ms,它的时间精度比clock函数的要高,GetTickCount()常用于多媒体中。
7:Windows下timeGetTime
使用:需要包含Mmsystem.h,Windows.h,加入静态库Winmm.lib.(静态库的添加参考:)
timeBeginPeriod(1);
DWORD start = timeGetTime();
Sleep(100);
DWORD end = timeGetTime();
timeEndPeriod(1);
原理:timeGetTime也时常用于多媒体定时器中,可以通过查询进行定时。通过查询进行定时,本身也会影响定时器的定时精度。
精度:毫秒,与GetTickCount()相当。但是和GetTickCount相比,timeGetTime可以通过timeBeginPeriod,timeEndPeriod设置定时器的最小解析精度,
timeBeginPeriod,timeEndPeriod必须成对出现。
8:windows下的timeSetEvent
使用:还记的VC下的Timer吗?Timer是一个定时器,而以上我们提到几种时间函数或者类型,实现定时功能只能通过轮训来实现,也就是必须另外创建一个线程单独处理,这样会影响定时精度,好在windows提供了内置的定时器timeSetEvent,函数原型为
MMRESULT timeSetEvent( UINT uDelay, //以毫秒指定事件的周期
UINT uResolution, //以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms
LPTIMECALLBACK lpTimeProc, //指向一个回调函数
WORD dwUser, //存放用户提供的回调数据
UINT fuEvent )// 标志参数,TIME_ONESHOT:执行一次;TIME_PERIODIC:周期性执行
&&&&&& 具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在 lpFunction回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是:任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后,应及时调用timeKillEvent()将之释放。(参考:&)
原理:可以理解为代回调函数的timeGetTime
精度:毫秒,timeSetEvent可以通过timeBeginPeriod,timeEndPeriod设置定时器的最小解析精度, timeBeginPeriod,timeEndPeriod必须成对出现。
9:高精度时控函数QueryPerformanceFrequency,QueryPerformanceCounter
使用:定义在windows.h头文件里。
LARGE_INTEGER m_nF
LARGE_INTEGER m_nBeginT
LARGE_INTEGER nEndT
QueryPerformanceFrequency(&m_nFreq);
//获取时钟频率,返回bool类型的值,非零,硬件支持高精度计数器;零,硬件不支持,读取失败。
QueryPerformanceCounter(&m_nBeginTime);//获取时钟计数,同样返回bool类型的值,非零,硬件支持高精度计数器;零,硬件不支持,读取失败。
Sleep(100);
QueryPerformanceCounter(&nEndTime);//获取时钟计数
cout && (nEndTime.QuadPart-m_nBeginTime.QuadPart)*1000/m_nFreq.QuadPart &&
原理:CPU上也有一个计数器,以机器的clock为单位,可以通过rdtsc读取,而不用中断,因此其精度与系统时间相当。
精度:计算机获取硬件支持,精度比较高,可以通过它判断其他时间函数的精度范围。
以上提到常用的9种时间函数,由于他们的用处不同,所以他们的精度也不尽相同,所以如果简单的延时可以用sleep函数,稍微准确的延时可以使用clock函数,GetTickCount函数,更高级的实用timeGetTime函数;简单的定时事件可以用Timer,准确地可以用timeSetEvent;或取一般系统时间可以通time,或者CTime,或者COleDateTime,获取准确的时间可以用clock,或者GetTickCount函数,或者timeGetTime函数,而获取准确地系统时间要使用硬件支持的QueryPerformanceFrequency函数,QueryPerformanceCounter函数。

&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3913次
排名:千里之外
原创:31篇
(2)(7)(1)(6)(8)(5)(1)(2)2017年4月 VC/MFC大版内专家分月排行榜第二2017年3月 VC/MFC大版内专家分月排行榜第二2017年2月 VC/MFC大版内专家分月排行榜第二2016年8月 VC/MFC大版内专家分月排行榜第二2016年7月 VC/MFC大版内专家分月排行榜第二2016年6月 VC/MFC大版内专家分月排行榜第二2015年6月 VC/MFC大版内专家分月排行榜第二
2017年6月 VC/MFC大版内专家分月排行榜第三2017年5月 VC/MFC大版内专家分月排行榜第三2016年9月 VC/MFC大版内专家分月排行榜第三2016年4月 VC/MFC大版内专家分月排行榜第三2015年4月 VC/MFC大版内专家分月排行榜第三2012年8月 VC/MFC大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。关于timeSetEvent的回调有关问题 - VC/MFC当前位置:& &&&关于timeSetEvent的回调有关问题关于timeSetEvent的回调有关问题&&网友分享于:&&浏览:301次关于timeSetEvent的回调问题我想用timeSetEvent实现40ms回调一次函数 函数内向串口发送消息 但是回调函数要是静态的话 往函数里写代码全是错误
不是静态的话 timeSetEvent的第三个参数出错
有大虾知道怎么解决么------解决方案--------------------探讨引用:timeSetEvent第3个是全局的就可以,类似线程起的函数一样,函数里面DWORD_PTR dwUser,可将自己需要的指针传进去,方便调用窗体的成员函数和变量而且我这么写 会产生error C2061: syntax error : identifier 'DWORD_PTR'这个错误
------解决方案--------------------如果报下面错误error LNK2001: unresolved external symbol 在stdafx.h中增加#pragma comment(lib,&winmm.lib&)
------解决方案--------------------
#include &stdafx.h&#include &stdio.h&#include &Windows.h&#include &Mmsystem.h&#pragma comment(lib, &Winmm.lib&)void WINAPI onTimeFunc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2);int _tmain(int argc, _TCHAR* argv[]){
MMRESULT timer_
int n = 0;
timer_id = timeSetEvent(5000, 1, (LPTIMECALLBACK)onTimeFunc, DWORD(1), TIME_PERIODIC);
if(NULL == timer_id)
printf(&timeSetEvent() failed with error %d\n&, GetLastError());
while(n&20)
printf(&Hello World\n&);
Sleep(2000);
timeKillEvent(timer_id);
//释放定时器
return 1;}void WINAPI onTimeFunc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2){
printf(&time out\n&);}
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 c 调用com组件 的文章

 

随机推荐