Make the CPU usage indicator work on Windows 2000.

This commit is contained in:
LoRd_MuldeR 2011-12-24 04:20:23 +01:00
parent e848b3bd8a
commit dce362c997
4 changed files with 65 additions and 9 deletions

View File

@ -30,7 +30,7 @@
#define VER_LAMEXP_MINOR_LO 4 #define VER_LAMEXP_MINOR_LO 4
#define VER_LAMEXP_TYPE Alpha #define VER_LAMEXP_TYPE Alpha
#define VER_LAMEXP_PATCH 12 #define VER_LAMEXP_PATCH 12
#define VER_LAMEXP_BUILD 834 #define VER_LAMEXP_BUILD 837
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Tool versions (minimum expected versions!) // Tool versions (minimum expected versions!)

View File

@ -136,6 +136,7 @@ SIZE_T lamexp_dbg_private_bytes(void);
//Helper macros //Helper macros
#define LAMEXP_DELETE(PTR) if(PTR) { delete PTR; PTR = NULL; } #define LAMEXP_DELETE(PTR) if(PTR) { delete PTR; PTR = NULL; }
#define LAMEXP_DELETE_ARRAY(PTR) if(PTR) { delete [] PTR; PTR = NULL; }
#define LAMEXP_SAFE_FREE(PTR) if(PTR) { free((void*) PTR); PTR = NULL; } #define LAMEXP_SAFE_FREE(PTR) if(PTR) { free((void*) PTR); PTR = NULL; }
#define LAMEXP_CLOSE(HANDLE) if(HANDLE != NULL && HANDLE != INVALID_HANDLE_VALUE) { CloseHandle(HANDLE); HANDLE = NULL; } #define LAMEXP_CLOSE(HANDLE) if(HANDLE != NULL && HANDLE != INVALID_HANDLE_VALUE) { CloseHandle(HANDLE); HANDLE = NULL; }
#define QWCHAR(STR) reinterpret_cast<const wchar_t*>(STR.utf16()) #define QWCHAR(STR) reinterpret_cast<const wchar_t*>(STR.utf16())

View File

@ -25,7 +25,24 @@
#include <QDir> #include <QDir>
#include <QLibrary> #include <QLibrary>
////////////////////////////////////////////////////////////
typedef enum { SystemProcInfo = 8 } SYSTEM_INFO_CLASS;
typedef struct
{
LARGE_INTEGER IdleTime;
LARGE_INTEGER KrnlTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER Reserved[2];
ULONG Reserved2;
}
SYSTEM_PROC_INFO;
typedef BOOL (WINAPI *GetSystemTimesPtr)(LPFILETIME lpIdleTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime); typedef BOOL (WINAPI *GetSystemTimesPtr)(LPFILETIME lpIdleTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime);
typedef LONG (WINAPI *NtQuerySystemInformationPtr)(SYSTEM_INFO_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength);
#define IS_OK(X) (((LONG)(X)) == ((LONG)0x00000000L))
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// Constructor & Destructor // Constructor & Destructor
@ -74,7 +91,11 @@ ULONGLONG CPUObserverThread::filetime2ulonglong(const void *ftime)
void CPUObserverThread::observe(void) void CPUObserverThread::observe(void)
{ {
QLibrary kernel32("kernel32.dll"); QLibrary kernel32("kernel32.dll"), ntdll("ntdll.dll");
ULONG performanceInfoSize = 0;
BYTE *performanceInfoBuffer = NULL;
NtQuerySystemInformationPtr querySysInfo = NULL;
GetSystemTimesPtr getSystemTimes = NULL; GetSystemTimesPtr getSystemTimes = NULL;
if(kernel32.load()) if(kernel32.load())
@ -82,7 +103,22 @@ void CPUObserverThread::observe(void)
getSystemTimes = reinterpret_cast<GetSystemTimesPtr>(kernel32.resolve("GetSystemTimes")); getSystemTimes = reinterpret_cast<GetSystemTimesPtr>(kernel32.resolve("GetSystemTimes"));
} }
if(getSystemTimes != NULL) if(!getSystemTimes)
{
qWarning("GetSystemTimes() not found, falling back to NtQueryInformationProcess().");
if(ntdll.load())
{
querySysInfo = reinterpret_cast<NtQuerySystemInformationPtr>(ntdll.resolve("NtQuerySystemInformation"));
if(querySysInfo)
{
querySysInfo(SystemProcInfo, &performanceInfoBuffer, 0, &performanceInfoSize);
if(performanceInfoSize < sizeof(SYSTEM_PROC_INFO)) performanceInfoSize = sizeof(SYSTEM_PROC_INFO);
performanceInfoBuffer = new BYTE[performanceInfoSize];
}
}
}
if(getSystemTimes || (querySysInfo && performanceInfoBuffer))
{ {
bool first = true; bool first = true;
double previous = -1.0; double previous = -1.0;
@ -96,12 +132,29 @@ void CPUObserverThread::observe(void)
forever forever
{ {
if(getSystemTimes(&idlTime, &sysTime, &usrTime)) bool ok = false;
if(getSystemTimes)
{
if(ok = getSystemTimes(&idlTime, &sysTime, &usrTime))
{ {
sys[1] = sys[0]; sys[0] = filetime2ulonglong(&sysTime); sys[1] = sys[0]; sys[0] = filetime2ulonglong(&sysTime);
usr[1] = usr[0]; usr[0] = filetime2ulonglong(&usrTime); usr[1] = usr[0]; usr[0] = filetime2ulonglong(&usrTime);
idl[1] = idl[0]; idl[0] = filetime2ulonglong(&idlTime); idl[1] = idl[0]; idl[0] = filetime2ulonglong(&idlTime);
}
}
else
{
if(ok = IS_OK(querySysInfo(SystemProcInfo, performanceInfoBuffer, performanceInfoSize, NULL)))
{
sys[1] = sys[0]; sys[0] = reinterpret_cast<SYSTEM_PROC_INFO*>(performanceInfoBuffer)[0].KrnlTime.QuadPart;
usr[1] = usr[0]; usr[0] = reinterpret_cast<SYSTEM_PROC_INFO*>(performanceInfoBuffer)[0].UserTime.QuadPart;
idl[1] = idl[0]; idl[0] = reinterpret_cast<SYSTEM_PROC_INFO*>(performanceInfoBuffer)[0].IdleTime.QuadPart;
}
}
if(ok)
{
if(first) if(first)
{ {
first = false; first = false;
@ -132,8 +185,10 @@ void CPUObserverThread::observe(void)
} }
else else
{ {
qWarning("GetSystemTimes() ist not available on this system!"); qWarning("NtQueryInformationProcess() not available, giving up!");
} }
LAMEXP_DELETE_ARRAY(performanceInfoBuffer);
} }
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////

View File

@ -650,7 +650,7 @@ void InitializationThread::selfTest(void)
qDebug("%02i -> %s", ++n, g_lamexp_tools[i].pcName); qDebug("%02i -> %s", ++n, g_lamexp_tools[i].pcName);
} }
} }
if(n != 24) if(n != 25)
{ {
qFatal("Tool count mismatch !!!"); qFatal("Tool count mismatch !!!");
} }