QProcess und CPU Auslastung

Alles rund um die Programmierung mit Qt
Antworten
js
Beiträge: 59
Registriert: 4. Juli 2011 21:29

QProcess und CPU Auslastung

Beitrag von js »

Hi würde gerne die CPU Auslastung ausgeben.

//
double n,m,nSeks;
int nTime[100];
int CPU;
int i;
//
/* n,m,nSeks=10000;
CPU=0;
i=0;

asy->start(program, arguments);

Code: Alles auswählen

FILETIME ct,et,kt,ut;
GetProcessTimes(asy,&ct,&et,&kt,&ut);
m=nSeks*1000;
n=kt.dwLowDateTime-nTime[i];
if (n>m)
n=m;
CPU=int((n/m)*100);
nTime[i-1]=kt.dwLowDateTime;
i++;
mess(QString::number(CPU));

Bekomme als Ergebniss:
0 und dann immer 100 % :confused:
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: QProcess und CPU Auslastung

Beitrag von solarix »

Da zu antworten ist extrem schwierig, weil man für einen nachvollziehbaren Programmfluss entweder Codekommentare oder sinnvolle Variablenbezeichner benötigt. Weiters braucht man möglichst vollständigen Code.

Das Beispiel wirft folgende Fragen auf:
- wie wird im Projekt "asy" (QProcess) auf "asy" (HANDLE) gewandelt
- was geschieht im Nullten Durchlauf (i == 0) und bei i == 99...
- was ist "nSecs" und wie wird es ermittelt
- was ist "n > m" für ein Fall (denn genau bei diesem erhälst du ja CPU=100)
- weisst du was du tust mit "dwLowDateTime"? Ich bin kein Windows-Entwickler, aber ich frage mich
-- was genau "dwHighDateTime" ist und
-- warum in der Doku steht "It is not recommended that you add and subtract values from the FILETIME structure to obtain relative times"
- warum wird nur die Kernelzeit (kt) verwendet und nicht auch die Usertime?
- Weiters können Testprogramme ja tatsächlich zwischen 0 und 100% hin und her wechseln (ein Computerprogramm kann ja gar nichts anderes als "Laufen" oder "Warten"). Von daher kennen wir hier natürlich auch deine Testumgebung nicht (weder das Testprogramm noch der Takt, mit welchem deine Berechnung läuft).

Ausserdem solltest du doch die Zeitberechnung jederzeit im Debugger nachvollziehen können. Wenn das Testprogramm z.B. eine 20% Last ergibt und du 100% erhälst, solltest du in der Lage sein, wenigstens den Fehler eingrenzen zu können (z.B. "Kernelzeit" ist wie erwartet, aber die "Realzeit" stimmt einfach nicht). Falls du mit einem Debugger nicht umgehen kannst, könntest du auch die Berechnung mittels "qDebug()" ausgeben lassen. z.B.

Code: Alles auswählen

  qDebug() << "Last-Berechnung" << i << n << m << CPU << nSecs .....;
Das würde dir (und allenfalls auch uns) auch helfen..

hth..
js
Beiträge: 59
Registriert: 4. Juli 2011 21:29

Re: QProcess und CPU Auslastung

Beitrag von js »

hmm du hast recht der Code ist misst... gibts bei qt eine andere möglich die Auslastung auszulesen
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: QProcess und CPU Auslastung

Beitrag von solarix »

Wenn ich eine Qt-Variante kennen würde, wäre meine vorherige Antwort wesentlich kürzer ausgefallen :wink:

Aber nur weil der Code nicht funktioniert, bedeutet es ja auch nicht, dass der Weg grundsätzlich der falsche ist. Weil ich kein Windows habe muss ich mich an dieser Stelle leider ausklinken. Wenn ich dich wäre, würde ich:
- den Weg wie bisher versuchen (GetProcessTimes)
- mir die oben gestellten Fragen genau beantworten
- mit qDebug() alle Erwartungen im Code genau prüfen
- auf den Array verzichten (du brauchst nur den letzten Wert, nicht ALLE Werte.. eine Membervariabel "mLastKernelTime" oder so würde also genügen)
- die Messung auf keinen Fall zu schnell laufen lassen.. maximal 1x pro Sekunde.

hth!
Antworten