CPU Auslastung auslesen



  • Wenn ich bei XP STRG+ALT+ENTF drücke, kann ich ja die CPU Auslastung, in Prozent anschauen. Ich möchte gern ein Programm schreiben was einem diesen Wert anzeigt. Wie geht das? Was ist die CPU Auslastung überhaupt? Ist es auch möglich die CPU Auslastung einzelner Prozesse anzuzeigen?



  • Kannst du dir über GetProcessTimes ausrechnen 🙂



  • flenders schrieb:

    Kannst du dir über GetProcessTimes ausrechnen 🙂

    Huh. Das klinkt mir kompliziert. Gibt es auch ein Beispiel für Dev-C++? Die Beispiele die ich bis jetzt gesehen habe waren alle für diese .NET sachen.



  • Ist eigentlich nicht allzu kompliziert:
    Einfach GetProccesTimes mehrmals aufrufen, dann teilst du die Zeitdifferenz der beiden Aufrufe durch die dazwischen vergangene Zeit - und schon hast du die Auslastung 🙂



  • Gut. Aber was muss ich als Parameter eintragen? Und wie kann ich die Zeit, zwischen den Aufrufen messen? Millisekunden genau reicht doch nicht oder?



  • Wo ist dein Problem mit den Parametern? Der erste ist das Prozess-Handle, und dann eben 4 Pointer auf FILETIME-Strukturen.
    Zur Messung der Zeitdifferenz: Wieso sollten Millisekunden nicht genau genug sein?! Du misst einfach die Zeit im Aktualisierungsintervall - z.B. 1 Sekunde o.ä. 🙂



  • Das versteh ich alles nicht. Wenn es so einfach ist, könntest du mir nicht dann den fertigen Code geben? bitte!



  • joomoo schrieb:

    ..... Ich möchte gern ein Programm schreiben was einem .....

    joomoo schrieb:

    Das versteh ich alles nicht. Wenn es so einfach ist, könntest du mir nicht dann den fertigen Code geben? bitte!

    Was nun schreiben" oder "basteln"? (Copy´n Paste)

    Ich denke mal du kommst mit der 64Bit Struktur (2 x 32Bit) nicht klar, oder weißt du nicht wie man eine Differenz in Prozent rechnet?

    Du kannst auch mit "FileTimeToSystemTime(const FILETIME* lpFileTime, LPSYSTEMTIME lpSystemTime);"
    das in SystemTime umwandeln, vieleicht kommst du damit besser klar.



  • Ich habe mal was zusammengebastelt. Genieße es aber mit Vorsicht - habe schon lang nichts mehr gecodet:

    double GetCPULoad()
    {
    	static DWORD dwLastProcessTime = 0;
    	static DWORD dwLastSystemTime = 0;
    	static double dCPULoad = 0;
    
    	FILETIME ftCreationTime, ftExitTime, ftKernelTime, ftUserTime;
    	GetProcessTimes(GetCurrentProcess(),&ftCreationTime,&ftExitTime,&ftKernelTime,&ftUserTime);
    
    	ULARGE_INTEGER uiKernelTime, uiUserTime;
    	uiKernelTime.HighPart = ftKernelTime.dwHighDateTime;
    	uiKernelTime.LowPart  = ftKernelTime.dwLowDateTime;
    	uiUserTime.HighPart = ftUserTime.dwHighDateTime;
    	uiUserTime.LowPart  = ftUserTime.dwLowDateTime;
    
    	DWORD dwActualProcessTime = (DWORD)((uiKernelTime.QuadPart + uiUserTime.QuadPart)/100);
    	DWORD dwActualSystemTime  = GetTickCount();
    
    	if(dwLastSystemTime) {
    		dCPULoad = (double)(dwActualProcessTime-dwLastProcessTime)/(dwActualSystemTime-dwLastSystemTime);
    	}
    	dwLastProcessTime = dwActualProcessTime;
    	dwLastSystemTime  = dwActualSystemTime;
    
    	return dCPULoad;
    }
    

    Zur Initialisierung musst du die Funktion erst einmal so aufrufen 🙂



  • Kleiner Hinweis noch,

    dies funktioniert nicht bei Windows 9x



  • flenders schrieb:

    Ich habe mal was zusammengebastelt. Genieße es aber mit Vorsicht - habe schon lang nichts mehr gecodet:

    double GetCPULoad()
    {
    	static DWORD dwLastProcessTime = 0;
    	static DWORD dwLastSystemTime = 0;
    	static double dCPULoad = 0;
    
    	FILETIME ftCreationTime, ftExitTime, ftKernelTime, ftUserTime;
    	GetProcessTimes(GetCurrentProcess(),&ftCreationTime,&ftExitTime,&ftKernelTime,&ftUserTime);
    
    	ULARGE_INTEGER uiKernelTime, uiUserTime;
    	uiKernelTime.HighPart = ftKernelTime.dwHighDateTime;
    	uiKernelTime.LowPart  = ftKernelTime.dwLowDateTime;
    	uiUserTime.HighPart = ftUserTime.dwHighDateTime;
    	uiUserTime.LowPart  = ftUserTime.dwLowDateTime;
    
    	DWORD dwActualProcessTime = (DWORD)((uiKernelTime.QuadPart + uiUserTime.QuadPart)/100);
    	DWORD dwActualSystemTime  = GetTickCount();
    
    	if(dwLastSystemTime) {
    		dCPULoad = (double)(dwActualProcessTime-dwLastProcessTime)/(dwActualSystemTime-dwLastSystemTime);
    	}
    	dwLastProcessTime = dwActualProcessTime;
    	dwLastSystemTime  = dwActualSystemTime;
    
    	return dCPULoad;
    }
    

    Zur Initialisierung musst du die Funktion erst einmal so aufrufen 🙂

    Er sagt
    14 untitled1.cpp
    `union _ULARGE_INTEGER' has no member named `HighPart'
    Aber sonst keine Fehler. Wie kann ich dieses Problem umgehen? (ich hab dev-c++)



  • MiC++ha schrieb:

    joomoo schrieb:

    ..... Ich möchte gern ein Programm schreiben was einem .....

    joomoo schrieb:

    Das versteh ich alles nicht. Wenn es so einfach ist, könntest du mir nicht dann den fertigen Code geben? bitte!

    Was nun schreiben" oder "basteln"? (Copy´n Paste)

    Ich denke mal du kommst mit der 64Bit Struktur (2 x 32Bit) nicht klar, oder weißt du nicht wie man eine Differenz in Prozent rechnet?

    Du kannst auch mit "FileTimeToSystemTime(const FILETIME* lpFileTime, LPSYSTEMTIME lpSystemTime);"
    das in SystemTime umwandeln, vieleicht kommst du damit besser klar.

    Wenn du etwas nicht KANNST, dann kannst du es nicht einfach schreiben. Wenn dir jemand zeigt wies geht und du dirs kopierst, wirstes nicht checken, aber später sagste vielleicht: AHHH! Genau! Jetzt check ich det.

    64Bit Struktur? Hä? Mit Prozent kann ich, hatten wir in der Schule. Mit dem FileTime komm ich nicht klar. Was soll ich mit der SystemTime??? Ich check gar nichts.



  • Also ich mach erst ein Führerschein bevor ich Auto fahre und guck mir das nicht vom Kumpel ab, denn dann bau ich garantiert ein Unfall!!!

    Ich will damit sagen das du dich vieleicht erst mal kurz (wirklich kurz) mit
    dieser Datenstruktur auseinandersetzt, sie ist im Prinzip einfach, auch wenn
    es in der MSDN besch...eiden beschrieben ist und wenn du das dann mit Hi und Low Word und DWORD so wie die Struct von Filetime einigermassen weißt, ließt
    sich der Code von flenders wie was Selbstgeschriebenes.
    Nun kopierst du den Code und schon hast du einen Unfall (Fehlermeldung) und
    weißt nicht warum.

    ULARGE_INTEGER ist in winnt.h deklardiert und includen muß du windows.h (wirst du ja haben), da du devcpp verwendest kann es sein das du noch ne lib zu linken
    muß mit -l***, aber er hat in jedem Fall nen Member namens DWORD HighPart.



  • Evtl. müsstest du dann noch ein .u einfügen, also z.B. so: 😕

    uiKernelTime.u.HighPart
    

    siehe auch: http://msdn.microsoft.com/library/en-us/winprog/winprog/ularge_integer_str.asp



  • flenders schrieb:

    Evtl. müsstest du dann noch ein .u einfügen, also z.B. so: 😕

    uiKernelTime.u.HighPart
    

    siehe auch: http://msdn.microsoft.com/library/en-us/winprog/winprog/ularge_integer_str.asp

    Nein ich habe es gerade beim devcpp getestet, er akzeptiert die obere Struct von der UNION, also liegt der Fehler woanders aber auch nur wenn er den gleichen Compiler und Linker verwendet wie ich.

    Dev-C++: Mingw32 gcc



  • Ich hab Dev-C++ 4 mit Mingw. Mit dem "u." klappts, allerdings zeigt er mir als CPU Auslastung immer 0 an.



  • joomoo schrieb:

    Ich hab Dev-C++ 4 mit Mingw. Mit dem "u." klappts, allerdings zeigt er mir als CPU Auslastung immer 0 an.

    Ruff die Funktion nur ein mal pro Sekunde auf, was für ein Wert erhälst du dann?



  • Und du musst natürlich auch etwas machen, sonst ist die Auslastung ja nahezu bei 0 🤡



  • flenders schrieb:

    Und du musst natürlich auch etwas machen, sonst ist die Auslastung ja nahezu bei 0 🤡

    Wenn ich daneben STRG+ALT+ENTF laufen lasse zeigt das mir aber 2-10% immer so an.



  • Du rufst die Funktion aber schon mehrmals auf, oder? Naja, kann auch sein, dass mein Code fehlerhaft ist 🙄


Log in to reply