为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用QueryPerformanceCounter?

如何使用QueryPerformanceCounter?

C++
手掌心 2019-07-02 09:59:56
如何使用QueryPerformanceCounter?我最近决定,我的计时器类需要从使用毫秒改为微秒,经过一些研究后,我认为QueryPerformanceCounter可能是我最安全的赌注。(对.的警告Boost::Posix它可能不能在Win 32 API上工作,这让我有点犹豫)。但是,我不太确定如何实现它。我所做的就是管它叫什么GetTicks()我正在使用的esque函数,并将其分配给Timer的startingTicks变量。然后,为了找出传递的时间,我只需将函数的返回值从startingTicks,当我重置计时器时,我只需再次调用函数并将startingTick分配给它。不幸的是,从我看到的代码来看,它并不像调用QueryPerformanceCounter(),我不知道我应该通过什么作为它的论点。
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

我使用这些定义:

/** Use to init the clock */#define TIMER_INIT \
    LARGE_INTEGER frequency; \
    LARGE_INTEGER t1,t2; \    double elapsedTime; \    QueryPerformanceFrequency(&frequency);/** Use to start the performance timer */#define TIMER_START QueryPerformanceCounter(&t1);/** Use to stop the performance timer and output the result to the standard stream. Less verbose than \c TIMER_STOP_VERBOSE */#define TIMER_STOP \    QueryPerformanceCounter(&t2); \
    elapsedTime=(float)(t2.QuadPart-t1.QuadPart)/frequency.QuadPart; \
    std::wcout<<elapsedTime<<L" sec"<<endl;

用法(括号以防止重新定义):

TIMER_INIT{
   TIMER_START   Sleep(1000);
   TIMER_STOP}{
   TIMER_START   Sleep(1234);
   TIMER_STOP}

使用示例的输出:

1.00003 sec
1.23407 sec


查看完整回答
反对 回复 2019-07-02
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

假设你在Windows上(如果是这样的话,你应该把你的问题标记成这样!)此MSDN页面您可以找到一个简单、有用的源。HRTimerC+类,它封装所需的系统调用来执行非常接近您所需的事情(添加一个GetTicks()方法,特别是要做的事情。一点儿没错你所需要的)。

在非Windows平台上,没有QueryPerformanceCounter函数,因此解决方案不能直接移植。但是,如果您确实将其包装在一个类中,如上面提到的HRTimer,将类的实现更改为使用当前平台确实能够提供的功能(可能通过Boost或其他方式)会更容易。


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 1139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信