Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 03, 2025 11:39

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: CPU Auslastung
BeitragVerfasst: Fr Mai 27, 2011 16:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich versuche grade die CPU Auslastung irgendwie auszulesen (Windows XP Sp 2).
Hab es mit GetSystemTimes() probiert wie es auch in vielen stellen im internet beschrieben wird:

Code:
  1. unsigned long usage = 0;
  2.  
  3. static ULARGE_INTEGER lastIdleTime;
  4. static ULARGE_INTEGER lastKernelTime;
  5. static ULARGE_INTEGER lastUserTime;
  6.  
  7. ULARGE_INTEGER idleTime, kernelTime, userTime;
  8. if (GetSystemTimes((LPFILETIME)&idleTime, (LPFILETIME)&kernelTime, (LPFILETIME)&userTime)) {
  9.     if (((kernelTime.QuadPart - lastKernelTime.QuadPart) + (userTime.QuadPart - lastUserTime.QuadPart)) > 0)
  10.         usage = (((((kernelTime.QuadPart - lastKernelTime.QuadPart) + (userTime.QuadPart - lastUserTime.QuadPart)) - (idleTime.QuadPart - lastIdleTime.QuadPart)) * 100) / ((kernelTime.QuadPart - lastKernelTime.QuadPart) + (userTime.QuadPart - lastUserTime.QuadPart)));
  11.        
  12.     lastIdleTime.QuadPart = idleTime.QuadPart;
  13.     lastKernelTime.QuadPart = kernelTime.QuadPart;
  14.     lastUserTime.QuadPart = userTime.QuadPart;
  15.  
  16.     return usage;
  17. }


Wenn ich den test " > 0" nicht mache bekomme ich laufend "Division by zero" fehler.
Im Task Manager haben die CPUs gemeinsam eine last von ca. 70%.. wenn ich die usage in einer endlosschleife abfrage kommt meist 0, manchmal 50 und ganz selten 100 raus.. sonst nichts.

Hat jemand eine Idee was ich verkehrt mache?

Aya~

PS: Wie nutzt man denn eigentlich das neue SyntaxHighlighting?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CPU Auslastung
BeitragVerfasst: Fr Mai 27, 2011 22:16 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
Hi Aya,

ich lese die CPU Auslastung mit Hilfe der Performance Counter aus. Vielleicht hilft/nützt Dir das ja was.

Code:
  1.  
  2. #include <Pdh.h>
  3. #pragma comment(lib, "pdh.lib")
  4.  
  5.     HQUERY cpuQuery;
  6.     HCOUNTER cpuQueryCounter;
  7.  
  8. // initialisieren
  9.  
  10.     long cpuUsage = 0;
  11.  
  12.     PDH_STATUS pdhStatus;
  13.     pdhStatus = PdhOpenQuery(0, 0, &cpuQuery);
  14.         if (pdhStatus == ERROR_SUCCESS)
  15.         pdhStatus = PdhAddCounter(cpuQuery, TEXT("\\Processor(_Total)\\% processor time"), 0, &cpuQueryCounter);
  16.  
  17.  
  18. // cpu auslastung auslesen
  19.  
  20.     PDH_FMT_COUNTERVALUE cpuUsageValue;
  21.     if (pdhStatus == ERROR_SUCCESS)
  22.     {
  23.         PdhCollectQueryData(cpuQuery);
  24.         PdhGetFormattedCounterValue(cpuQueryCounter, PDH_FMT_LONG, 0, &cpuUsageValue);
  25.         cpuUsage = cpuUsageValue.longValue;
  26.     }
  27. // und dann später wieder aufräumen
  28.  
  29.     if (pdhStatus == ERROR_SUCCESS)
  30.         PdhCloseQuery(cpuQuery);
  31.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CPU Auslastung
BeitragVerfasst: Sa Mai 28, 2011 09:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
OT:
Aya hat geschrieben:
PS: Wie nutzt man denn eigentlich das neue SyntaxHighlighting?

Entweder indem du [code =sprache] (ohne Leerzeichen natürlich) oder [sprache] benutzt. C++ ist allerdings cpp da keine Sonderzeichen gehen.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CPU Auslastung
BeitragVerfasst: Mi Jun 01, 2011 10:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

das mit dem phd* schaut schon ganz vielversprechend aus, danke!

Aber, eine frage noch am rande.. da steht als Minimum supported System "Windows 2000 Professional"
Nicht das ich vorhabe noch ältere Systeme zu unterstützen, aber.. nehmen wir an ich baue das bei mir ein und jemand startet mein Programm unter Windows 98.. stürzt es dann einfach ab weil die funktionen nicht aus irgendwelchen DLLs geladen werden können?

Worauf ich hinaus will.. es gibt ja öffters Funktionen die erst später in Windows verfügbar sind (z.B. ab Vista).
Gibt es da sowas wie bei OpenGL das ich überprüfen kann ob diese Funktion verfügbar ist oder nicht und dann entsprechend reagiere?

Also etwa so:

Code:
  1. int getCPUTime()
  2. {
  3.   if (currentSystem() >= Win2kProf) {
  4.     phdOpenQuery(...
  5.     ..
  6.     ..
  7.     return cpuQuery;
  8.   }
  9.   return 0;
  10. }


Geht das? Also werden die funktionen wie phdOpenQuery() einfach nicht geladen und sind NULL unter Win98? Oder crasht es?

Aya


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CPU Auslastung
BeitragVerfasst: Mi Jun 01, 2011 14:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also vom Prinzip funktioniert das in etwa so wie du das vorhast. Also überprüfen welches Windows man vor sich hat und entsprechend diese oder jede Methode benutzen. ABER. Meistens ist es so, dass die Methoden statisch gelinkt sind. Und dann überprüft bereits das Betriebssystem ob alle Methoden+DLLs vorhanden sind (dafür gibt es eine Tabelle in der Exe). Wenn nicht wird die Ausführung der Anwendung unterbunden. Benutzen kannst du so etwas dann allerdings nur, wenn die Methoden dynamisch zur Laufzeit geladen werden. Anders sieht es aus, wenn Flags die an Methoden übergeben werden plötzlich unter Vista/7 noch zusätzliche Werte kennen. Aber ist auch klar. Die Methoden gibt es dann schon.

Allerdings als Mindestvorrausstzung 2000 ist in meinen Augen vollkommen okay. Ich denke alleine diverse Systemkomponten etc. werden das von sich aus wohl schon vorschreiben. Dürfte den Aufwand nicht Wert sein, da was zu versuchen. Viel interessanter ist sicher ob unter Vista/7 noch auf die passenden Sachen zugreifen kannst ohne Adminrechte.

Ich meine ich hätte auch schon CPU Auslastung angezeigt. Ich habe das aber glaube via CPU-Zeit festgemacht. Mit irgendeiner funktion habe ich gemessen wie viel CPU-Zeit zu meinem letzten Messzeitpunkt vergangen ist und anhand davon konnte man sagen, dass ein Prozess in der letzten Sekunden knapp 2 Sekunden lang die CPU beschäftigt hat. Aber frag mich nicht mehr was das für eine Methode war. Müsste ich wenn dann zu Hause noch nachschauen. Wenn ich den Code überhaupt noch habe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CPU Auslastung
BeitragVerfasst: Mi Jun 01, 2011 14:52 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
Hi Aya, hi Lossy,

wie Lossy schon erwähnt hat macht es wenig Sinn Win9X noch zu unterstützen da, nicht nur Pdh, bereits andere Komponenten mindestens ein Windows NT haben möchten.

Falls Du es aber unbedingt brauchst kann ich Dir auch für Win9x code raussuchen der dir die CPU Auslastung ermittelt. Das funktioniert da ähnlich.

@Lossy
Der Pdh kramt rennt auch in einem nicht admin usercontext.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CPU Auslastung
BeitragVerfasst: Mi Jun 01, 2011 14:54 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
achso und Du solltest vielleicht nicht "getCPUTime()" als Namen verwenden, besser "getCPUUsage()" passt etwas besser, da Dir die Pdh Funktionen % liefern anstatt Sekunden :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.016s | 16 Queries | GZIP : On ]