Taux d'occupation du processeur

0/5 (9 avis)

Snippet vu 9 001 fois - Téléchargée 35 fois

Contenu du snippet

Tout est dans le titre, ce petit programme affiche le taux d'occupation du processeur.

Attention : ne fonctionne qu'avec Windows 2000 serveur ou Windows XP.

Source / Exemple :


Type
  // Structure utilisée pour le retour des temps d'utilisation systèmes
  TSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION=Record
    Case Integer Of
    1:( IdleTime   : Int64;   // Temps inoccpé     par pas de 100 NanoSecondes
        KernelTime : Int64;   // Temps du noyau    par pas de 100 NanoSecondes
        UserTime   : Int64;   // Temps utilisateur par pas de 100 NanoSecondes
        Reserved1  : Array[0..2]Of Int64;
        Reserved2  : Cardinal;);
    2:( Res        : Array[1..$138]Of Byte);
  End;

// Fonction de demande d'informations sytèmes. Elle sert pour diverses
// demandes sytèmes suivant le paramètre SystemInfoClass. Voir MSDN
// pour plus de détails.
Function NtQuerySystemInformation(SystemInfoClass:Integer;Info:Pointer;InfoLength:Cardinal;
            Var ReturnLength:Cardinal):Integer;StdCall;
            External 'NTDLL.DLL' Name 'NtQuerySystemInformation';

Const
  // Constante utilisée pour la demande d'occupation du processeur
  SystemProcessorPerformanceInformation=$2;

  // Constantes de conversion
  CentNanoSecondesParJour = 24.0*60.0*60.0*10000000.0;
  MilliSecondesParJour    = 24.0*60.0*60.0*1000.0;

Var
  MemTickTotal : Integer = 0;
  MemTickIdle  : Integer = 0;

procedure TForm1.Timer1Timer(Sender: TObject);
Var Info      : TSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
    Long      : Cardinal;
    TickTotal : Integer;
    TickIdle  : Integer;
    DiffTotal : Integer;
    DiffIdle  : Integer;
    Occupe    : Double;
begin
  // Primo on demande les information au système
  NtQuerySystemInformation(SystemProcessorPerformanceInformation,@Info,SizeOf(Info),Long);

  // Conversion du temps 'idle' en millisecondes
  TickIdle  := Info.IdleTime Div 10000;
  // Obtention du temps total
  TickTotal := GetTickCount;

  // Calcul du pourcentage
  DiffIdle  := TickIdle  - MemTickIdle;
  DiffTotal := TickTotal - MemTickTotal;
  Occupe    := 100-DiffIdle/DiffTotal*100;
  If Occupe<0 Then Occupe:=0;

  // Affichage des informations
  Label1.Caption        := FormatDateTime('HH:NN:SS:zzz',Info.IdleTime   /CentNanoSecondesParJour);
  Label4.Caption        := FormatDateTime('HH:NN:SS:zzz',TickTotal       /MilliSecondesParJour   );
  Label5.Caption        := IntToStr(Round(Occupe));
  ProgressBar1.Position := Trunc(Occupe);

  // Mémorisation pour le prochain passage
  MemTickIdle  := TickIdle;
  MemTickTotal := TickTotal;
end;

Conclusion :


Cette source et quelques autres sur : http://nono40.developpez.com

A voir également

Ajouter un commentaire Commentaires
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
4 mai 2008 à 11:28
Le problème vient en fait de la valeur attribuée à la constante SystemProcessorPerformanceInformation lorsque l'on a affaire à plusieurs processeurs.

Si (comme ici) on a :
SystemProcessorPerformanceInformation = $2;
Alors :
* Processeur unique : Les données renvoyées concernent l'occupation processeur totale.
* Processeurs multiples : Les données renvoyées concernent l'application seule.

Mais si l'on a :
SystemProcessorPerformanceInformation = $8;
Alors :
* Processeur unique : Les données renvoyées concernent l'occupation processeur totale (c'est à dire la même chose que précdemment avec la constante réglée à $2 !)
* Processeurs multiples : Les données renvoyées sont sous forme d'un array contenant les informations séparées de tous les processeurs installés (l'emploi du code ici présent ne renvoie donc QUE l'utilisation du PREMIER processeur)

D'après MSDN (http://msdn.microsoft.com/en-us/library/ms724509.aspx) :
"NtQuerySystemInformation may be altered or unavailable in future versions of Windows. Applications should use alternate functions"

Il est maintenant conseillé d'utiliser la fonction GetSystemTimes.
Plus d'infos sur cette fonction :
http://msdn.microsoft.com/en-us/library/ms724400(VS.85).aspx
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
4 mai 2008 à 11:21
Le problème vient en fait de la valeur attribuée à la constante SystemProcessorPerformanceInformation lorsque l'on a affaire à plusieurs processeurs.

Si (comme ici) on a :
SystemProcessorPerformanceInformation = $2;
Alors :
* Processeur unique : Les données renvoyées concernent l'occupation processeur totale.
* Processeurs multiples : Les données renvoyées concernent l'application seule.

Mais si l'on a :
SystemProcessorPerformanceInformation = $8;
Alors :
* Processeur unique : Les données renvoyées concernent l'occupation processeur totale (c'est à dire la même chose que précdemment avec la constante réglée à $2 !)
* Processeurs multiples : Les données renvoyées sont sous forme d'un array contenant les informations séparées de tous les processeurs installés (l'emploi du code ici présent ne renvoie donc QUE l'utilisation du PREMIER processeur)

D'après MSDN (http://msdn.microsoft.com/en-us/library/ms724509.aspx) :
"NtQuerySystemInformation may be altered or unavailable in future versions of Windows. Applications should use alternate functions"

Il est maintenant conseillé d'utiliser la fonction GetSystemTimes.
Plus d'infos sur cette fonction :
http://msdn.microsoft.com/en-us/library/ms724400(VS.85).aspx
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
4 mai 2008 à 10:23
Après de plus amples tests, il semble que la différence apparaisse également entre plusieurs versions de Windows XP...

Qui sait exactement ce que renvoie ce code?
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
3 mai 2008 à 16:56
A noter quelque-chose d'important :
Ce code exécuté sous Windows XP ou antérieur (en tout cas tout ce qui n'est pas Vista mais qui reste compatible, je pense notamment à Windows 2000 etc...) renvoie le taux d'occupation GLOBAL du processeur, alors que le même code exécuté sous Windows Vista renvoie le taux d'occupation processeur de l'application SEULE.

Ce n'est pas du tout la même chose ! Pensez-y lorsque vous l'utilisez...
cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
3 mai 2003 à 20:11
C'est quand DiffTotal est nul, il faudrait que je rajoute un test. Sinon il faudrait augmenter la durée du timer pour avoir un calcul plus juste.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.