PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Pourcentage d'utilisation CPU
Pourcentage d'utilisation CPU
Iniciado por jack31, 29,ene. 2019 10:50 - 5 respuestas
Miembro registrado
37 mensajes
Publicado el 29,enero 2019 - 10:50
Bonjour,

Quelqu'un aurait-il une solution pour calculer le pourcentage d'utilisation des processeurs ?
Pour info, je tourne sous Windows 10.

J'ai essayé ça, déclenché par un timer toutes les secondes mais les résultats sont totalement incohérents.

// Code d'initialisation de collection de procédure.

typeFILETIME est une structure // Utilisation des processeurs.
mentDwLowDateTime est un entier sur 4
mentDwHighDateTime est un entier sur 4
FIN
gentIdleAncien est un entier sans signe sur 8
gentKernAncien est un entier sans signe sur 8
gentUserAncien est un entier sans signe sur 8
gbln1ère est un booléen


FONCTION Renvoyer_InfosProcesseurs

// Variables locales.

lstrFTIdle est un typeFILETIME
lstrFTKern est un typeFILETIME
lstrFTUser est un typeFILETIME
lentIdleActuel est un entier sans signe sur 8
lentIdleDifférence est un entier sans signe sur 8
lentKernActuel est un entier sans signe sur 8
lentKernDifférence est un entier sans signe sur 8
lentUserActuel est un entier sans signe sur 8
lentUserDifférence est un entier sans signe sur 8
lentSystDifférence est un entier sans signe sur 8
lrelCPU est un réel
lentRésultat est un entier


// Obtient les informations concernant l'usage de la mémoire centrale.

lentRésultat = API("KERNEL32","GetSystemTimes",&lstrFTIdle,&lstrFTKern,&lstrFTUser)
lentIdleActuel = bitDécaleGauche(lstrFTIdle:mentDwHighDateTime,32) + lstrFTIdle:mentDwLowDateTime
lentKernActuel = bitDécaleGauche(lstrFTKern:mentDwHighDateTime,32) + lstrFTKern:mentDwLowDateTime
lentUserActuel = bitDécaleGauche(lstrFTUser:mentDwHighDateTime,32) + lstrFTUser:mentDwLowDateTime

// Calcule le pourcentage d'utilisation des processeurs.

SI gbln1ère ALORS
lentIdleDifférence = lentIdleActuel - gentIdleAncien
lentKernDifférence = lentKernActuel - gentKernAncien
lentUserDifférence = lentUserActuel - gentUserAncien
lentSystDifférence = lentKernDifférence + lentUserDifférence
SI lentSystDifférence > 0 ALORS
lrelCPU = ((lentSystDifférence - lentIdleDifférence) * 100 / lentSystDifférence)
SINON
lrelCPU = 0
FIN
Trace(NumériqueVersChaîne(lrelCPU,"3,2f"))
FIN

// Mémorise les mesures.

gentIdleAncien = lentIdleActuel
gentKernAncien = lentKernActuel
gentUserAncien = lentUserActuel
gbln1ère = Vrai


Merci d'avance pour votre aide.
J@ck
Miembro registrado
1.002 mensajes
Publicado el 29,enero 2019 - 11:02
Miembro registrado
37 mensajes
Publicado el 29,enero 2019 - 11:10
Merci Jordan.
J'ai effectivement vu la réponse de Philippe Pasquali avant de poster mais je n'utilise pas .NET et je n'y ai donc rien compris...
Ca devrait fonctionner avec des APIs de Windows, non ?
Miembro registrado
37 mensajes
Publicado el 29,enero 2019 - 12:40
Re,

En poussant mes recherches un peu plus loin, je m'aperçois que les résultats affichés ne sont pas si faux que cela.
En effet, je basais mon affirmation précédente en comparant mon résultat à celui affiché par le moniteur de ressources de Windows (10), or je m'aperçois que le pourcentage d'utilisation affiché par ce dernier dépasse 100% quand je lance plusieurs applications très consommatrices en CPU en parallèle.
Tout est question d'interprétation : un pourcentage peut-il être supérieur à 100% ?
Publicado el 30,enero 2019 - 10:44
Voici un bout de code (trouvé sur ce forum) et adapté à mon usage
Les résultats sont globalement cohérents

Resultats est un objet Automation dynamique
objLocator est un objet Automation "WbemScripting.SWbemLocator"
objService est un objet Automation dynamique
objService = objLocator>>ConnectServer(".", "root\cimv2")
objService>>Security_>>ImpersonationLevel = 3
zProc_Cpu_Load()

PROCÉDURE PRIVÉE zProc_Cpu_Load()
// Procédure automatique :
// La procédure est exécutée manuellement, lors d'un appel dans le code
// Elle sera répétée en boucle, en attendant 1 seconde et 23 centièmes de seconde entre chaque appel
// Chaque appel suivant exécute une seule fois la procédure, sans timer


Resultats = objService>>ExecQuery("SELECT LoadPercentage FROM Win32_Processor")
SI Resultats>>Count ALORS
JAUGE_CPU0=Resultats>>ItemIndex(0)>>Properties_>>Item("LoadPercentage")>>Value
SELON JAUGE_CPU0
CAS<10: JAUGE_CPU0..CouleurJauge=nBleuJauge
CAS<20: JAUGE_CPU0..CouleurJauge=VertFoncé
CAS<30: JAUGE_CPU0..CouleurJauge=OrangeClair
CAS<40: JAUGE_CPU0..CouleurJauge=OrangeFoncé
AUTRE CAS
JAUGE_CPU0..CouleurJauge=RougeClair
FIN
FIN
Miembro registrado
37 mensajes
Publicado el 30,enero 2019 - 12:15
Merci Benoît, je vais tester ça avec le plus grand intérêt et comparer les résultats à ceux que j'obtiens avec mon code basé sur les APIs de Windows.
:merci:
Amicalement,
J@ck