我正在尝试创建一个计时器,它以某个值开头,并以另一个值结束,如。
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 ...
完成的答案 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();
...
}