Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

110 lines
3.5 KiB

#ifndef __DBGTIMER_H_INCLUDED
#define __DBGTIMER_H_INCLUDED
class CDebugTimer
{
private:
FILETIME m_ftBeginTime;
TCHAR m_szTitle[MAX_PATH];
public:
CDebugTimer( LPCTSTR pszTimerName=NULL )
{
Start( pszTimerName );
}
virtual ~CDebugTimer(void)
{
End();
}
void GetSystemTimeAsFileTime( FILETIME &ft )
{
SYSTEMTIME st;
GetSystemTime( &st );
SystemTimeToFileTime( &st, &ft );
}
void Start( LPCTSTR pszName )
{
lstrcpy( m_szTitle, TEXT("") );
if (pszName && *pszName)
{
GetSystemTimeAsFileTime(m_ftBeginTime);
lstrcpy( m_szTitle, pszName );
}
}
void WriteToFile( LPCTSTR szMessage )
{
TCHAR szFilename[MAX_PATH];
if (GetEnvironmentVariable(TEXT("WIADEBUGFILE"),szFilename,sizeof(szFilename)/sizeof(TCHAR)))
{
HANDLE m_hMutex = CreateMutex( NULL, FALSE, TEXT("CDebugTimerFileMutex") );
if (m_hMutex)
{
DWORD dwResult = WaitForSingleObject( m_hMutex, 1000 );
if (WAIT_OBJECT_0==dwResult)
{
HANDLE hFile = CreateFile( szFilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if (INVALID_HANDLE_VALUE == hFile)
{
DWORD dwBytesWritten;
SetFilePointer( hFile, 0, NULL, FILE_END );
WriteFile( hFile, szMessage, lstrlen(szMessage) * sizeof(TCHAR), &dwBytesWritten, NULL );
CloseHandle(hFile);
}
else
{
OutputDebugString(TEXT("CDebugTimer::WriteToFile: Unable to open log file\n"));
}
ReleaseMutex(m_hMutex);
}
else
{
OutputDebugString(TEXT("WaitForSingleObject failed\n"));
}
CloseHandle(m_hMutex);
}
else
{
OutputDebugString(TEXT("CDebugTimer::WriteToFile: Unable to create mutex\n"));
}
}
}
void Elapsed(void)
{
if (lstrlen(m_szTitle))
{
FILETIME ft;
GetSystemTimeAsFileTime(ft);
LARGE_INTEGER liStart, liEnd;
liStart.LowPart = m_ftBeginTime.dwLowDateTime;
liStart.HighPart = m_ftBeginTime.dwHighDateTime;
liEnd.LowPart = ft.dwLowDateTime;
liEnd.HighPart = ft.dwHighDateTime;
LONGLONG nElapsedTime = liEnd.QuadPart - liStart.QuadPart;
nElapsedTime /= 10000;
int nMilliseconds = (int)(nElapsedTime % 1000);
nElapsedTime /= 1000;
int nSeconds = (int)(nElapsedTime);
TCHAR szMessage[MAX_PATH];
wsprintf(szMessage, TEXT("*TIMER* Elapsed time for [%s]: %d.%04d\n"), m_szTitle, nSeconds, nMilliseconds );
OutputDebugString( szMessage );
WriteToFile( szMessage );
}
}
void End(void)
{
Elapsed();
lstrcpy( m_szTitle, TEXT("") );
}
};
#if defined(DBG) || defined(_DEBUG) || defined(DEBUG)
#define WIA_TIMEFUNCTION(x) CDebugTimer _debugFunctionDebugTimer(TEXT(x))
#define WIA_TIMERSTART(n,x) CDebugTimer _debugTimer##n(TEXT(x))
#define WIA_TIMEREND(n) _debugTimer##n.End()
#else
#define WIA_TIMEFUNCTION(x)
#define WIA_TIMERSTART(n,x)
#define WIA_TIMEREND(n)
#endif
#endif