(时间管理)精确获取时间

上传人:管****问 文档编号:119729288 上传时间:2020-01-24 格式:DOC 页数:32 大小:78.55KB
返回 下载 相关 举报
(时间管理)精确获取时间_第1页
第1页 / 共32页
(时间管理)精确获取时间_第2页
第2页 / 共32页
(时间管理)精确获取时间_第3页
第3页 / 共32页
(时间管理)精确获取时间_第4页
第4页 / 共32页
(时间管理)精确获取时间_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《(时间管理)精确获取时间》由会员分享,可在线阅读,更多相关《(时间管理)精确获取时间(32页珍藏版)》请在金锄头文库上搜索。

1、精确获取时间(QueryPerformanceCounter)LARGE_INTEGER tima,timb;QueryPerformanceCounter(&tima);在 Windows Server 2003 和 WindowsXP 中使用 QueryPerformanceCounter 函数的程序可能执行不当QueryPerformanceCounter 來精確計算執行時間QueryPerformanceCounter 來精確計算執行時間/ 這個程式展示了如何使用QueryPerformanceCounter 來精確計算執行時間/代码1. LARGE_INTEGERm_liPerfFr

2、eq=0;2. /获取每秒多少CPUPerformanceTick3. QueryPerformanceFrequency(&m_liPerfFreq);4. 5. LARGE_INTEGERm_liPerfStart=0;6. QueryPerformanceCounter(&m_liPerfStart);7. 8. for(inti=0;i100;i+)9. coutiendl;10.11. LARGE_INTEGERliPerfNow=0;12. /计算CPU运行到现在的时间13. QueryPerformanceCounter(&liPerfNow);14.15. inttime=(l

3、iPerfNow.QuadPart-m_liPerfStart.QuadPart)*1000)/m_liPerfFreq.QuadPart);16.17. charbuffer100;18. sprintf(buffer,執行時間%dmillisecond,time);19.20. coutbufferendl;21.22.QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时.但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到QueryPerformanceCounte

4、r()返回的嘀哒声的频率.QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数.计算确切的时间是从第一次调用QueryPerformanceCounter()开始的假设得到的LARGE_INTEGER为nStartCounter,过一段时间后再次调用该函数结束的,设得到nStopCounter.两者之差除以QueryPerformanceFrequency()的频率就是开始到结束之间的秒数.由于计时函数本身要耗费很少的时间,要减去一个很少的时间开销.但一般都把这个开销忽略.公式如下: nStopCounter-nStartCounterElapsedTi

5、me=- - overheadfrequencydouble time=(nStopCounter.QuadPart-nStartCounter.QuadPart)/frequency.QuadPart这两个函数是VC提供的仅供Windows 95及其后续版本使用的精确时间函数,并要求计算机从硬件上支持精确定时器。QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型如下: BOOL QueryPerformanceFrequency(LARGE_INTEGER lpFrequency); BOOL QueryPerforman

6、ceCounter(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()函数获得机器内部定时器的时钟频率,然后在

7、需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经历的精确时间。下列代码实现1ms的精确定时:1. LARGE_INTEGERlitmp;2. LONGLONGQPart1,QPart2;3. doubledfMinus,dfFreq,dfTim;4. QueryPerformanceFrequency(&litmp);5. dfFreq=(double)litmp.QuadPart;/获得计数器的时钟频率6. QueryPerformanceCounter(&litmp);7. QPart1=li

8、tmp.QuadPart;/获得初始值8. do9. 10. QueryPerformanceCounter(&litmp);11. QPart2=litmp.QuadPart;/获得中止值12. dfMinus=(double)(QPart2-QPart1);13. dfTim=dfMinus/dfFreq;/获得对应的时间值,单位为秒14. while(dfTim0.001);其定时误差不超过1微秒,精度与CPU等机器配置有关。 下面的程序用来测试函数Sleep(100)的精确持续时间: 1. LARGE_INTEGERlitmp;2. LONGLONGQPart1,QPart2;3. d

9、oubledfMinus,dfFreq,dfTim;4. QueryPerformanceFrequency(&litmp);5. dfFreq=(double)litmp.QuadPart;/获得计数器的时钟频率6. QueryPerformanceCounter(&litmp);7. QPart1=litmp.QuadPart;/获得初始值8. Sleep(100);9. QueryPerformanceCounter(&litmp);10. QPart2=litmp.QuadPart;/获得中止值11. dfMinus=(double)(QPart2-QPart1);12. dfTim=

10、dfMinus/dfFreq;/获得对应的时间值,单位为秒由于Sleep()函数自身的误差,上述程序每次执行的结果都会有微小误差。下列代码实现1微秒的精确定时:1. LARGE_INTEGERlitmp;2. LONGLONGQPart1,QPart2;3. doubledfMinus,dfFreq,dfTim;4. QueryPerformanceFrequency(&litmp);5. dfFreq=(double)litmp.QuadPart;/获得计数器的时钟频率6. QueryPerformanceCounter(&litmp);7. QPart1=litmp.QuadPart;/获

11、得初始值8. do9. 10. QueryPerformanceCounter(&litmp);11. QPart2=litmp.QuadPart;/获得中止值12. dfMinus=(double)(QPart2-QPart1);13. dfTim=dfMinus/dfFreq;/获得对应的时间值,单位为秒14. while(dfTim0.000001);其定时误差一般不超过0.5微秒,精度与CPU等机器配置有关。(VC多线程编程(转)VC中多线程使用比较广泛而且实用,在网上看到的教程.感觉写的挺好.一、问题的提出编写一个耗时的单线程程序:新建一个基于对话框的应用程序SingleThread

12、,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下:voidCSingleThreadDlg:OnSleepSixSecond()Sleep(6000);/延时6秒编译并运行应用程序,单击“延时6秒”按钮,你就会发现在这6秒期间程序就象“死机”一样,不在响应其它消息。为了更好地处理这种耗时的操作,我们有必要学习多线程编程。二、多线程概述进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的

13、资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 经营企划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号