begin process at 2010 02 09 21:39:42
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > TAUX D'OCCUPATION DU PROCESSEUR

TAUX D'OCCUPATION DU PROCESSEUR


 Information sur la source

Note :
8 / 10 - par 3 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Niveau :Initié Date de création :03/05/2003 Date de mise à jour :03/05/2003 02:19:18 Vu :4 991

Auteur : Nono40

Ecrire un message privé
Site perso
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • 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;
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


 Sources du même auteur

Source avec Zip SYNCHRONISER DEUX LISTBOX
Source avec Zip Source avec une capture SUPPRIMER LE SCINTILLEMENT AVEC DOUBLEBUFFERED
SETFOCUS SUR UN BOUTON D'UN RADIOGROUP
Source avec Zip DESSINER DANS LE SYSTRAY AVEC CREATEICON
Source avec Zip AJOUT D'UNE IMAGE EN FOND D'UN TSTRINGGRID

 Sources de la même categorie

Source avec Zip NEXTGENS -> UNITÉS DE TYPES ÉVOLUÉS NOUVELLE GÉNÉRATION (DE... par f0xi
Source avec Zip Source avec une capture AUTO-COMPLÉTION D'UN CONTRÔLE DE SAISIE par Bacterius
Source avec Zip CARDS GAME SDK 1.0.0.0 par f0xi
Source avec Zip Source avec une capture TRAYICON - VOTRE ICONE DANS LA BARRE DES TACHES par Bacterius
Source avec Zip Source avec une capture WINHIDER _ CACHER UN PROGRAMME DE L'ÉCRAN ET DE LA BARRE DE ... par soldier8514

Commentaires et avis

Commentaire de fabiin le 03/05/2003 09:57:56

Symap !
Marche pas si mal.
par contre chez moi le taux d'occupation ne va que de 10 en 10... c pas très précis ...

Commentaire de Nono40 le 03/05/2003 12:24:14

Bizarre, chez moi c'est nickel...
Quelle valeur as-tu mis dans le Timer ? ( j'ai mis 100 ms ). Si tu ne pets que 10ms, la valeur risque d'aller de 10 en 10. A mon avis il ne faut pas descendre en dessous de 100ms.

Commentaire de fabiin le 03/05/2003 13:37:12

Salut, j'ai aussi mi 100ms
En faite, ca va aps de 10 en 10 tous le temps,...Le plus souvent oui, mais sinon y'a aussi des valeurs autres ki sotn affichés,... :)

Commentaire de fabiin le 03/05/2003 13:43:55

sinon, g aussi oublier de dire un truk :
des fois, je c pas kel est la cause,
y'a l'erreur suivante ki survient sur la ligne
Occupe  := 100-DiffIdle/DiffTotal*100;
"invalide float operation"
notemment kan je descent en dessous de 100ms...

Commentaire de Nono40 le 03/05/2003 20:11:21

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.

Commentaire de ni69 le 03/05/2008 16:56:29

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...

Commentaire de ni69 le 04/05/2008 10:23:47

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?

Commentaire de ni69 le 04/05/2008 11:21:15

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

Commentaire de ni69 le 04/05/2008 11:28:49

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

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales