Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Prozessorauslastung

dav / 10 Antworten / Baumansicht Nickles

Hallo!


Ich schreibe gerade ein Admin-Toll in Visual C++ (MFC).


Wie kann ich die Prozessor-Auslastung in einer Variable speichern?


dav

bei Antwort benachrichtigen
thomas woelfer dav „Prozessorauslastung“
Optionen

du nimmst den wert der auslastung und weist ihn zu? - ich glaube ich verstehe die frage nicht....

WM_FYI

this posting contains no tpyos.
bei Antwort benachrichtigen
dav Nachtrag zu: „Prozessorauslastung“
Optionen

Nein, wie ich den Wert der auslastung bekomme.

dav

bei Antwort benachrichtigen
thomas woelfer dav „Nein, wie ich den Wert der auslastung bekomme. dav“
Optionen

am einfachsten mit wmi und der win32_processor klasse. alternativ mit der performance registry (http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b174631) (oder msdn kb artikel Q174631.

je nachdem mit welcher sprache bzw. platform du arbeitest geht das auch einfacher.so gibt z.b. unter .net einfach ein objekt im toolbar das man danach fragen kann...

WM_HOPETHISHELPS

this posting contains no tpyos.
bei Antwort benachrichtigen
dav Nachtrag zu: „Prozessorauslastung“
Optionen

Wie konkret (ich verstehs nicht).

dav

bei Antwort benachrichtigen
thomas woelfer dav „Wie konkret ich verstehs nicht . dav“
Optionen

was verstehst du denn nicht? der eine link den ich gepostet habe fuehrt doch zu einem quellcode-beispiel.. ?

WM_QUERY

this posting contains no tpyos.
bei Antwort benachrichtigen
dav Nachtrag zu: „Prozessorauslastung“
Optionen

Wo ist da die Prozessor-Azslastung?

dav

bei Antwort benachrichtigen
thomas woelfer dav „Wo ist da die Prozessor-Azslastung? dav“
Optionen

das steht in der dokumentation hinter dem link.

WM_FYI

this posting contains no tpyos.
bei Antwort benachrichtigen
dav Nachtrag zu: „Prozessorauslastung“
Optionen

Geht das auch unter Win2k und NT und XP?

dav

bei Antwort benachrichtigen
thomas woelfer dav „Geht das auch unter Win2k und NT und XP? dav“
Optionen

WMI ist bei w2k und xp von haus aus dabei. fuer nt und 9.x gibts optionale kostenlose komponenten die das (zum teil) liefern. die performance registry gibts wie in der doku beschrieben nur unter nt, w2k und xp.

WM_FYI

this posting contains no tpyos.
bei Antwort benachrichtigen
dav Nachtrag zu: „Prozessorauslastung“
Optionen

Danke an dich, thomas_woelfer.
Aber ich habe schon einen Weg gefunden (auf www.planetsourcecode.com):
// cpusagent.cpp (Windows NT/2000)
//
// Getting the CPU usage in percent on Windows NT/2000
//
// (c)2000 Ashot Oganesyan K, SmartLine, Inc
// mailto:ashot@aha.ru, http://www.protect-me.com, http://www.codepile.com

#include <windows.h>
#include <conio.h>
#include <stdio.h>

#define SystemBasicInformation 0
#define SystemPerformanceInformation 2
#define SystemTimeInformation 3

#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))

typedef struct
{
DWORD dwUnknown1;
ULONG uKeMaximumIncrement;
ULONG uPageSize;
ULONG uMmNumberOfPhysicalPages;
ULONG uMmLowestPhysicalPage;
ULONG uMmHighestPhysicalPage;
ULONG uAllocationGranularity;
PVOID pLowestUserAddress;
PVOID pMmHighestUserAddress;
ULONG uKeActiveProcessors;
BYTE bKeNumberProcessors;
BYTE bUnknown2;
WORD wUnknown3;
} SYSTEM_BASIC_INFORMATION;

typedef struct
{
LARGE_INTEGER liIdleTime;
DWORD dwSpare[76];
} SYSTEM_PERFORMANCE_INFORMATION;

typedef struct
{
LARGE_INTEGER liKeBootTime;
LARGE_INTEGER liKeSystemTime;
LARGE_INTEGER liExpTimeZoneBias;
ULONG uCurrentTimeZoneId;
DWORD dwReserved;
} SYSTEM_TIME_INFORMATION;


// ntdll!NtQuerySystemInformation (NT specific!)
//
// The function copies the system information of the
// specified type into a buffer
//
// NTSYSAPI
// NTSTATUS
// NTAPI
// NtQuerySystemInformation(
// IN UINT SystemInformationClass, // information type
// OUT PVOID SystemInformation, // pointer to buffer
// IN ULONG SystemInformationLength, // buffer size in bytes
// OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit
// // variable that receives
// // the number of bytes
// // written to the buffer
// );
typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);

PROCNTQSI NtQuerySystemInformation;


void main(void)
{
SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
SYSTEM_TIME_INFORMATION SysTimeInfo;
SYSTEM_BASIC_INFORMATION SysBaseInfo;
double dbIdleTime;
double dbSystemTime;
LONG status;
LARGE_INTEGER liOldIdleTime = {0,0};
LARGE_INTEGER liOldSystemTime = {0,0};

NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
GetModuleHandle("ntdll"),
"NtQuerySystemInformation"
);

if (!NtQuerySystemInformation)
return;

// get number of processors in the system
status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
if (status != NO_ERROR)
return;

printf("\nCPU Usage (press any key to exit): ");
while(!_kbhit())
{
// get new system time
status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
if (status!=NO_ERROR)
return;

// get new CPU's idle time
status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
if (status != NO_ERROR)
return;

// if it's a first call - skip it
if (liOldIdleTime.QuadPart != 0)
{
// CurrentValue = NewValue - OldValue
dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);

// CurrentCpuIdle = IdleTime / SystemTime
dbIdleTime = dbIdleTime / dbSystemTime;

// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors + 0.5;

printf("\b\b\b\b%3d%%",(UINT)dbIdleTime);
}

// store new CPU's idle and system time
liOldIdleTime = SysPerfInfo.liIdleTime;
liOldSystemTime = SysTimeInfo.liKeSystemTime;

// wait one second
Sleep(1000);
}
printf("\n");
}

bei Antwort benachrichtigen