// //////////////////////////////////////////////////////////////////////////
// Implementation file WinNtTimer.cpp for class WinNtTimer
// (c)Copyright 2000, Baptiste Lepilleur.
// Created: 2002/04/19
// //////////////////////////////////////////////////////////////////////////
#include "WinNtTimer.h"
/*! Returns time spent in the thread.
* @param rquadTime Receive the time spent in the thread (user+kernel time)
* in unit of 100 nano-seconds.
* In pratice, the effective resolution is 10ms !!!
*
* @return \c true if sucess, \c false otherwise.
*/
static bool
GetThreadSpentTime( LONGLONG &rquadTime )
{
FILETIME timeCreation;
FILETIME timeExit;
FILETIME timeKernel;
FILETIME timeUser;
if ( !::GetThreadTimes( ::GetCurrentThread(),
&timeCreation,
&timeExit,
&timeKernel,
&timeUser) )
{
rquadTime = 0;
return false;
}
LARGE_INTEGER lintKernel;
lintKernel.LowPart = timeKernel.dwLowDateTime;
lintKernel.HighPart = timeKernel.dwHighDateTime;
LARGE_INTEGER lintUser;
lintUser.LowPart = timeUser.dwLowDateTime;
lintUser.HighPart = timeUser.dwHighDateTime;
rquadTime = lintKernel.QuadPart + lintUser.QuadPart;
return true;
}
void
WinNtTimer::start()
{
m_isValid = GetThreadSpentTime( m_beginTime );
}
void
WinNtTimer::finish()
{
LONGLONG quadTimeEnd;
LONGLONG quadProcessedElapse;
m_isValid = m_isValid && GetThreadSpentTime( quadTimeEnd );
if ( m_isValid )
{
quadProcessedElapse = quadTimeEnd - m_beginTime;
m_elapsedTime = double(quadProcessedElapse) / 10000000;
}
else
m_elapsedTime = -1;
}
double
WinNtTimer::elapsedTime() const
{
return m_elapsedTime;
}