Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
prog:lazarus:cas:windows:cpu [14/06/2023 11:40]
thierry [Sources & Ressources]
prog:lazarus:cas:windows:cpu [17/06/2023 17:03] (Version actuelle)
thierry [GetSystemTimes]
Ligne 6: Ligne 6:
  
 ===== Via WMI ===== ===== Via WMI =====
-==== Informations générales ​====+==== Root\CIMV2\Win32_Processor ​====
 <code wql wql sur root/​CIMV2>​ <code wql wql sur root/​CIMV2>​
 Select * from Win32_Processor Select * from Win32_Processor
Ligne 60: Ligne 60:
  
 </​codedoc></​codedoc>​ </​codedoc></​codedoc>​
-==== Charge ==== +=== LoadPercentage ​=== 
-Avec la requette WMI ci dessous, on récupére ''​CurrentClockSpeed''​ et ''​LoadPercentage''​.+Type - UInt16
  
-''​LoadPercentage'' ​retourne l'​utilisation du processeur ​a l'instant T.+La propriété ​''​LoadPercentage'' ​indique la capacité de charge de chaque ​processeur ​**calculée sur la dernière seconde**.\\ Le terme 'processor loading'​ réfère à la charge de traitement totale supportée par chaque processeur en une fois. 
 +=== ProcessorId === 
 +Type - String
  
-''​CurrentClockSpeed'' ​la vitesse ​du CPUmais n'a pas l'air de fluctuer comme on pourrait s'y attendre quand on regarde les performances dans le Gestionnaire de Tâches.+La propriété ​''​ProcessorId'' ​contient des informations spécifiques au processeur qui décrivent ses fonctionnalités. Pour les processeurs de classe x86, le format ​du champ dépend de la prise en charge de l’instruction CPUID par le processeur.\\ 
 +Si l’instruction est prise en chargela propriété ​''​ProcessorId'' contient deux valeurs au format DWORD.  
 +  - La première (décalages 08h-0Bh) est la valeur EAX renvoyée par une instruction CPUID avec l’entrée EAX définie à 1.  
 +  - La deuxième (décalages 0Ch-0Fh) est la valeur EDX renvoyées par cette instruction
  
-<code wql wql sur root/​CIMV2>​ +Seuls les deux premiers octets de la propriété ''​ProcessorID''​ sont significatifs (tous les autres sont définis à 0) et contiennent (au format WORD) le contenu du registre DX à la réinitialisation du processeur. 
-Select ​CurrentClockSpeed,​CurrentVoltage,​LoadPercentage ​from Win32_Processor+ 
 + 
 + 
 +==== Win32_PerfFormattedData_Counters_ProcessorInformation ==== 
 +<​codedoc>​ 
 +instance of Win32_PerfFormattedData_Counters_ProcessorInformation 
 +<codedoc toggle>​ 
 +
 + AverageIdleTime = "​3256073";​ 
 + C1TransitionsPersec = "​0";​ 
 + C2TransitionsPersec = "​2398";​ 
 + C3TransitionsPersec = "​0";​ 
 + ClockInterruptsPersec = 693; 
 + DPCRate = 5; 
 + DPCsQueuedPersec = 517; 
 + IdleBreakEventsPersec = "​2414";​ 
 + InterruptsPersec = 2948; 
 + Name = "​_Total";​ 
 + ParkingStatus = 0; 
 + PercentC1Time = "​0";​ 
 + PercentC2Time = "​96";​ 
 + PercentC3Time = "​0";​ 
 + PercentDPCTime = "​0";​ 
 + PercentIdleTime = "​100";​ 
 + PercentInterruptTime = "​0";​ 
 + PercentofMaximumFrequency = 93; 
 + PercentPerformanceLimit = 100; 
 + PercentPriorityTime = "​0";​ 
 + PercentPrivilegedTime = "​1";​ 
 + PercentPrivilegedUtility = "​1";​ 
 + PercentProcessorPerformance = "​66";​ 
 + PercentProcessorTime = "​0";​ 
 + PercentProcessorUtility = "​2";​ 
 + PercentUserTime = "​0";​ 
 + PerformanceLimitFlags = 0; 
 + ProcessorFrequency = 3600; 
 + ProcessorStateFlags = 0; 
 +}; 
 + 
 +</​codedoc></​codedoc>​ 
 + 
 +On peut **peut être** en déduire la charge du CPU en fonction de ''​PercentIdleTime''​ qui est le pourcentage de temps libre,\\ 
 +donc la charge du CPU devrait être (100-''​PercentIdleTime''​) 
 + 
 +On peut **peut être** en déduire la vitesse du CPU grâce a ''​PercentofMaximumFrequency''​.\\ 
 +Qui est censé être le pourcentage de la vitesse max.\\ 
 +Sachant que la vitesse du CPU est fournie par  ''​ProcessorFrequency''​. 
 + 
 +Mais ce ne sont que des suppositions qui mont l'air assez bancales.\\ 
 +En effet le CPU peut dépasser la vitesse fournie par  ''​ProcessorFrequency''​. 
 + 
 +Donc indice de fiabilité faible sur les données récupérées par ''​Win32_PerfFormattedData_Counters_ProcessorInformation''​ 
 + 
 + 
 + 
 +==== Win32_PerfFormattedData_PerfOS_Processor ==== 
 +<code wql wql sur Root/​CIMV2>​ 
 +Select ​from Win32_PerfFormattedData_PerfOS_Processor ​ WHERE Name="​_Total"​
 </​code>​ </​code>​
 <​codedoc>​ <​codedoc>​
-instance of Win32_Processor+Résultat -> instance of Win32_PerfFormattedData_PerfOS_Processor 
 +<codedoc toggle>
 { {
- CurrentClockSpeed ​3600+ C1TransitionsPersec ​"​2974"​
- CurrentVoltage ​10+ C2TransitionsPersec ​"​971"​
- DeviceID ​= "CPU0"; + C3TransitionsPersec ​= "0"; 
- LoadPercentage ​6;+ DPCRate ​2; 
 + DPCsQueuedPersec = 403; 
 + InterruptsPersec = 5750; 
 + Name = "​_Total";​ 
 + PercentC1Time = "​13";​ 
 + PercentC2Time = "​30";​ 
 + PercentC3Time = "​0";​ 
 + PercentDPCTime = "​0";​ 
 + PercentIdleTime = "​44";​ 
 + PercentInterruptTime = "​0";​ 
 + PercentPrivilegedTime = "​32";​ 
 + PercentProcessorTime = "​52";​ 
 + PercentUserTime = "​20"​;
 }; };
 +</​codedoc></​codedoc>​
 +
 +==== root\WMI\ ProcessorPerformance ====
 +<code wql wql sur Namespace = Root\WMI\>​
 +Select * from ProcessorPerformance
 +</​code>​
 +<​codedoc>​
 +Résultat -> instances of ProcessorPerformance
 +<codedoc toggle>
 +
 +instance of ProcessorPerformance
 +{
 + Active = TRUE;
 + frequency = 3600;
 + InstanceName = "​PPM_Processor_0";​
 + percentage = 48;
 + power = 1;
 +};
 +
 +instance of ProcessorPerformance
 +{
 + Active = TRUE;
 + frequency = 3600;
 + InstanceName = "​PPM_Processor_1";​
 + percentage = 64;
 + power = 1;
 +};
 +
 +instance of ProcessorPerformance
 +{
 + Active = TRUE;
 + frequency = 3600;
 + InstanceName = "​PPM_Processor_2";​
 + percentage = 55;
 + power = 1;
 +};
 +
 +instance of ProcessorPerformance
 +{
 + Active = TRUE;
 + frequency = 3600;
 + InstanceName = "​PPM_Processor_3";​
 + percentage = 56;
 + power = 1;
 +};
 +
 +instance of ProcessorPerformance
 +{
 + Active = TRUE;
 + frequency = 3600;
 + InstanceName = "​PPM_Processor_4";​
 + percentage = 66;
 + power = 1;
 +};
 +
 +instance of ProcessorPerformance
 +{
 + Active = TRUE;
 + frequency = 3600;
 + InstanceName = "​PPM_Processor_5";​
 + percentage = 32;
 + power = 1;
 +};
 +
 +instance of ProcessorPerformance
 +{
 + Active = TRUE;
 + frequency = 3600;
 + InstanceName = "​PPM_Processor_6";​
 + percentage = 47;
 + power = 1;
 +};
 +
 +instance of ProcessorPerformance
 +{
 + Active = TRUE;
 + frequency = 3600;
 + InstanceName = "​PPM_Processor_7";​
 + percentage = 35;
 + power = 1;
 +};
 +
 +</​codedoc>​
 </​codedoc>​ </​codedoc>​
 +
 +Pas grand chose intéressant a en retirer, mis a part le pourcentage de vitesse pour chaque CPU...
  
 ==== Autres pistes a étudier ==== ==== Autres pistes a étudier ====
Ligne 90: Ligne 250:
   * root\WMI\ProcessorBiosInfo   * root\WMI\ProcessorBiosInfo
   * root\CIMV2\Win32_AssociatedProcessorMemory   * root\CIMV2\Win32_AssociatedProcessorMemory
 +
 +===== Via PDH =====
 +Source : [[https://​learn.microsoft.com/​fr-fr/​windows/​win32/​perfctrs/​using-the-pdh-functions-to-consume-counter-data]]
 +===== Via les API Windows =====
 +==== GetSystemTimes ====
 +Source : [[https://​learn.microsoft.com/​en-us/​windows/​win32/​api/​processthreadsapi/​nf-processthreadsapi-getsystemtimes]]
 +<code delphi jwawinbase.pas>​
 +function GetSystemTimes(lpIdleTime,​ lpKernelTime,​ lpUserTime: LPFILETIME):​ BOOL; stdcall;
 +</​code> ​
 +
 +  * **lpIdleTime** :\\ Un pointeur vers une structure FILETIME qui reçoit la durée d'​inactivité du système.
 +  * **lpKernelTime**:​\\ Un pointeur vers une structure FILETIME qui reçoit le temps que le système a passé à s'​exécuter en mode noyau (y compris tous les threads de tous les processus, sur tous les processeurs). Cette valeur de temps inclut également la durée d'​inactivité du système.
 +  * **lpUserTime**:​\\ Un pointeur vers une structure FILETIME qui reçoit le temps que le système a passé à s'​exécuter en mode utilisateur (y compris tous les threads de tous les processus, sur tous les processeurs).
 +
 +
 +
  
  
Ligne 96: Ligne 272:
 ====== Sources & Ressources ====== ====== Sources & Ressources ======
   * [[https://​stackoverflow.com/​questions/​33571061/​get-the-percentage-of-total-cpu-usage]]   * [[https://​stackoverflow.com/​questions/​33571061/​get-the-percentage-of-total-cpu-usage]]
 +  * [[http://​delphiaccess.com/​foros/​index.php/​topic/​13894-saber-consumo-cpu-de-proceso-y-total/​]]