CPU Auslastung
-
Ich habs mir fast gedacht, dass wieder so ein dummer Kommentar von mosta kommt. Willst die Lösung mal wieder in den Ar5ch geschoben bekommen. :o
-
du solltest dich wirklich nicht so dämlich anstellen mosta. die lösung läßt sich in einer minute mit google finden. ich dachte du wolltest beruflich etwas in richtung programmierung machen.
-
gefunden hat ich den schon vorher nur ich hab es nicht zun laufen gebracht also seit ruhig. Man muss doch nicht immer ein Kommentar abgeben
#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; double CPUAuslastung(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 0; // get number of processors in the system status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL); if (status != NO_ERROR) return 0; // get new system time status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0); if (status!=NO_ERROR) return 0; // get new CPU's idle time status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL); if (status != NO_ERROR) return 0; // 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; } // store new CPU's idle and system time liOldIdleTime = SysPerfInfo.liIdleTime; liOldSystemTime = SysTimeInfo.liKeSystemTime; // wait one second //Sleep(1000); wird von nem Timer übernomen return dbIdleTime; }
da sin noch fehler drin aber deswegen hab ich es ja hierhin gepackt.
[ Dieser Beitrag wurde am 23.02.2003 um 18:46 Uhr von mosta editiert. ]
-
Hat sich das jetzt erledigt?
-
nein da ich versucht habe den Code einzubinden nur die Ausgabe war konstant 0.
-
Läßt sich doch garnicht kompilieren. Eine void-Funktion kann doch nicht 0 zurückgeben.
-
achso das war aber nicht der grund warum es sich nicht kompilieren, lies die main funktion fehlte. aber dann funktioniert es auch mit der richtigen ausgabe
-
ich hab das zu ner funktion umgeschreiben mit nem double als rückgabewert so das das ganze wieder Stimmig ist. Ich änder es dann jetzt nochmal siehe oben.
// get new system time status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0); if (status!=NO_ERROR) return 0;
hier gibt er mir nen falschen wert zurück wenn ich anzeige also return status mache dann kommt ne hohe minus Zahl.
-
Bereichsüberschreitung?!
-
bitte poste die zahl.
-
@ flenders wie kann ich das umgehen
-
Eine anderen Typ für den Rückgabewert nehmen
Laut Doku ist muss dies NTSTATUS sein (weiß zwar net, wie das definiert ist, aber egal
)
[ Dieser Beitrag wurde am 23.02.2003 um 19:00 Uhr von flenders editiert. ]
-
ich probiers mal aus
-
funktioniert nicht
-
ich krieg die Fehlermeldung Typ nicht definiert.
-
ist doch auch wurscht. der rückgabewert der funktion ist ja nicht die cpu-auslastung sondern der fehlercode.
-
Das soll auch ne Funktion sein die mir die CPU Auslastung zurück gibt und nicht den Fehlercode oder hab ich das wieder Falsch verstanden.
-
Du ermittelst über die Aufrufe von NtQuerySystemInformation nur die Systemzeit und die Idle-Time (Leerlauf), daraus wird dann die Prozessorauslastung berechnet
-
ungefähr so teste es später bin nicht zuhause.
double CPUAuslastung(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 0; // get number of processors in the system status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL); if (status != NO_ERROR) return 0; // get new system time status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0); if (status!=NO_ERROR) return 0; // get new CPU's idle time status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL); if (status != NO_ERROR) return 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; return dbIdleTime; }
-
es funktioniert nicht er zeigt mir immer noch nur die 0 bei CPU Auslastung an.
Was mach ich falsch am anfang hol ich mir doch die Werte aus NtQuerySystemInformation und lass dann die Auslastung berrechnen, so wie im Bsp. , nur das ich daraus ne funktion machen will.[ Dieser Beitrag wurde am 25.02.2003 um 16:39 Uhr von mosta editiert. ]