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
4 mai 2008 à 11:28
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
4 mai 2008 à 11:21
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
4 mai 2008 à 10:23
Qui sait exactement ce que renvoie ce code?
3 mai 2008 à 16:56
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...
3 mai 2003 à 20:11
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.