猿问

如何使用QueryPerformanceCounter?

如何使用QueryPerformanceCounter?

我最近决定,我的计时器类需要从使用毫秒改为微秒,经过一些研究后,我认为QueryPerformanceCounter可能是我最安全的赌注。(对.的警告Boost::Posix它可能不能在Win 32 API上工作,这让我有点犹豫)。但是,我不太确定如何实现它。

我所做的就是管它叫什么GetTicks()我正在使用的esque函数,并将其分配给Timer的startingTicks变量。然后,为了找出传递的时间,我只需将函数的返回值从startingTicks,当我重置计时器时,我只需再次调用函数并将startingTick分配给它。不幸的是,从我看到的代码来看,它并不像调用QueryPerformanceCounter(),我不知道我应该通过什么作为它的论点。


手掌心
浏览 1140回答 3
3回答

慕哥9229398

我使用这些定义:/**&nbsp;Use&nbsp;to&nbsp;init&nbsp;the&nbsp;clock&nbsp;*/#define&nbsp;TIMER_INIT&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;frequency;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;t1,t2;&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;elapsedTime;&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceFrequency(&frequency);/**&nbsp;Use&nbsp;to&nbsp;start&nbsp;the&nbsp;performance&nbsp;timer&nbsp;*/#define&nbsp;TIMER_START&nbsp;QueryPerformanceCounter(&t1);/**&nbsp;Use&nbsp;to&nbsp;stop&nbsp;the&nbsp;performance&nbsp;timer&nbsp;and&nbsp;output&nbsp;the&nbsp;result&nbsp;to&nbsp;the&nbsp;standard&nbsp;stream.&nbsp;Less&nbsp;verbose&nbsp;than&nbsp;\c&nbsp;TIMER_STOP_VERBOSE&nbsp;*/#define&nbsp;TIMER_STOP&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(&t2);&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;elapsedTime=(float)(t2.QuadPart-t1.QuadPart)/frequency.QuadPart;&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;std::wcout<<elapsedTime<<L"&nbsp;sec"<<endl;用法(括号以防止重新定义):TIMER_INIT{ &nbsp;&nbsp;&nbsp;TIMER_START&nbsp;&nbsp;&nbsp;Sleep(1000); &nbsp;&nbsp;&nbsp;TIMER_STOP}{ &nbsp;&nbsp;&nbsp;TIMER_START&nbsp;&nbsp;&nbsp;Sleep(1234); &nbsp;&nbsp;&nbsp;TIMER_STOP}使用示例的输出:1.00003&nbsp;sec 1.23407&nbsp;sec

红颜莎娜

假设你在Windows上(如果是这样的话,你应该把你的问题标记成这样!)此MSDN页面您可以找到一个简单、有用的源。HRTimerC+类,它封装所需的系统调用来执行非常接近您所需的事情(添加一个GetTicks()方法,特别是要做的事情。一点儿没错你所需要的)。在非Windows平台上,没有QueryPerformanceCounter函数,因此解决方案不能直接移植。但是,如果您确实将其包装在一个类中,如上面提到的HRTimer,将类的实现更改为使用当前平台确实能够提供的功能(可能通过Boost或其他方式)会更容易。
随时随地看视频慕课网APP
我要回答