NOTES :
Ce source ne fonctionne qu'avec Windows 2000 serveur et Windows Xp.
Ceci ne tient pas compte non plus d'un système multi-processeurs
CODE :
Unit Unit1; // // Sujet : Taux d'occupation du processeur // // Par Nono40 : http://nono40.developpez.com http://nono40.fr.st // mailTo:nono40@fr.st // // Le 02/05/2003 // Attention : compatible seulement avec Windows2000 serveur et Windows XP //
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 inoccupé 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;
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;
// Mémorisation pour le prochain passage
MemTickIdle := TickIdle;
MemTickTotal := TickTotal; End;
Var Fin:Boolean; Procedure TForm1.Button2Click(Sender: TObject); Begin
Fin:=False;
Button2.Enabled:=False; WhileNot Fin Do Application.ProcessMessages;
Button2.Enabled:=True; End;
Procedure TForm1.Button3Click(Sender: TObject); Begin
Fin := True; End;