与计时器合作

时间:2013-03-21 20:29:02

标签: c++ windows

我正在尝试创建一个计时器,它以某个值开头,并以另一个值结束,如。

int pktctr = (unsigned char)unpkt[0];

if(pktctr == 2)
{
    cout << "timer-begin" << endl;
    //start timer here

}

if(pktctr == 255)
{
    cout << "timer-end" << endl;
    //stop timer here
    //timer display total time then reset.

}

cout << "displays total time it took from 1 to 255 here" << endl;

关于如何实现这一目标的任何想法?

void WINAPI MyUCPackets(char* unpkt, int packetlen, int iR, int arg)
{
int pktctr = (unsigned char)unpkt[0];

if(pktctr == 2)
{
    cout << "timer-begin" << endl;

}

if(pktctr == 255)
{
    cout << "timer-end" << endl;

}

return MyUC2Packets(unpkt,packetlen,iR,arg);
}

每次调用此函数时,unpkt从2开始,然后达到最大值255,然后返回1.我想计算每次旋转需要多长时间?

这种情况会发生很多次。但我只是想检查一下这需要多少秒才会发生,因为每次都不一样。

注意:这是通过MSDetours 3.0 ...

完成的

3 个答案:

答案 0 :(得分:0)

如果您想使用Windows-API,请使用GetSystemTime()。提供结构SYSTEMTIME,正确初始化并将其传递给GetSystemTime()

#include <Windows.h>

 ...
 SYSTEMTIME sysTime;
 GetFileTime(&sysTime);
 // use sysTime and create differences

GetSystemTime()查看SYSTEMTIME,{{1}}也有{{1}}的链接。

答案 1 :(得分:0)

我假设您使用的是Windows(来自代码中的WINAPI),在这种情况下您可以使用GetTickCount

/* or you could have this elsewhere, e.g. as a class member or
 * in global scope (yuck!) As it stands, this isn't thread safe!
 */
static DWORD dwStartTicks = 0;

int pktctr = (unsigned char)unpkt[0];

if(pktctr == 2)
{
    cout << "timer-begin" << endl;
    dwStartTicks = GetTickCount();
}

if(pktctr == 255)
{
    cout << "timer-end" << endl;

    DWORD dwDuration = GetTickCount() - dwStartTicks;

    /* use dwDuration - it's in milliseconds, so divide by 1000 to get
     * seconds if you so desire.
     */
}

需要注意的事项:GetTickCount溢出是可能的(它大约每47天重置为0,所以如果你开始计时器接近翻转时间,它可能会在翻转后完成) 。您可以通过两种方式解决此问题:使用GetTickCount64或仅在dwStartTicks > GetTickCount时注意,如果是,则计算从dwStartTicks到翻转的毫秒数,以及{{1}的毫秒数1}}到0的结果并将这些数字加在一起(如果你能以更聪明的方式做到这一点,可以获得奖励积分)。

或者,您可以使用GetTickCount()功能。您可以在此处找到更多信息,包括如何在http://msdn.microsoft.com/en-us/library/4e2ess30(v=vs.71).aspx使用它的示例,它应该很容易适应并集成到您的代码中。

最后,如果您对更“标准”的解决方案感兴趣,可以使用C ++标准库中的clock内容。查看http://en.cppreference.com/w/cpp/chrono以获取示例。

答案 2 :(得分:0)

我认为boost timer是最适合您的解决方案。

您可以像这样检查已用时间:

#include <boost/timer.hpp>
int main() {   
boost::timer t; // start timing
 ...
 double elapsed_time = t.elapsed();
 ...
}