111 lines
3.5 KiB
C
111 lines
3.5 KiB
C
|
#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
|
||
|
|