====== Informations sur le CPU ======
===== But =====
Le but est de pouvoir récupérer les mèmes informations que sur le Gestionnaire de Tâches
{{:prog:lazarus:cas:windows:task1.jpg|}}
===== Via WMI =====
==== Root\CIMV2\Win32_Processor ====
Select * from Win32_Processor
instance of Win32_Processor
{
AddressWidth = 64;
Architecture = 9;
AssetTag = "To Be Filled By O.E.M.";
Availability = 3;
Caption = "Intel64 Family 6 Model 158 Stepping 9";
Characteristics = 252;
CpuStatus = 1;
CreationClassName = "Win32_Processor";
CurrentClockSpeed = 3600;
CurrentVoltage = 10;
DataWidth = 64;
Description = "Intel64 Family 6 Model 158 Stepping 9";
DeviceID = "CPU0";
ExtClock = 100;
Family = 198;
L2CacheSize = 1024;
L3CacheSize = 8192;
L3CacheSpeed = 0;
Level = 6;
LoadPercentage = 2;
Manufacturer = "GenuineIntel";
MaxClockSpeed = 3600;
Name = "Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz";
NumberOfCores = 4;
NumberOfEnabledCore = 4;
NumberOfLogicalProcessors = 8;
PartNumber = "To Be Filled By O.E.M.";
PowerManagementSupported = FALSE;
ProcessorId = "BFEBFBFF000906E9";
ProcessorType = 3;
Role = "CPU";
SecondLevelAddressTranslationExtensions = FALSE;
SerialNumber = "To Be Filled By O.E.M.";
SocketDesignation = "U3E1";
Status = "OK";
StatusInfo = 3;
SystemCreationClassName = "Win32_ComputerSystem";
SystemName = "PC-THIERRY";
ThreadCount = 8;
UpgradeMethod = 1;
Version = "";
VirtualizationFirmwareEnabled = FALSE;
VMMonitorModeExtensions = FALSE;
};
=== LoadPercentage ===
Type - UInt16
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
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 charge, la 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.
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.
==== Win32_PerfFormattedData_Counters_ProcessorInformation ====
instance of Win32_PerfFormattedData_Counters_ProcessorInformation
{
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;
};
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 ====
Select * from Win32_PerfFormattedData_PerfOS_Processor WHERE Name="_Total"
Résultat -> instance of Win32_PerfFormattedData_PerfOS_Processor
{
C1TransitionsPersec = "2974";
C2TransitionsPersec = "971";
C3TransitionsPersec = "0";
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";
};
==== root\WMI\ ProcessorPerformance ====
Select * from ProcessorPerformance
Résultat -> instances of ProcessorPerformance
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;
};
Pas grand chose intéressant a en retirer, mis a part le pourcentage de vitesse pour chaque CPU...
==== Autres pistes a étudier ====
* Win32_PerfRawData_Counters_ProcessorInformation
* Win32_PerfFormattedData_Counters_ProcessorInformation
* Win32_PerfRawData_GPUPerformanceCounters_GPUProcessMemory
* Win32_PerfFormattedData_PerfOS_Processor
* Win32_PerfRawData_PerfOS_Processor
* root\WMI\ProcessorBiosTStates
* root\WMI\ProcessorPerformance
* root\WMI\ProcessorBiosInfo
* 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]]
function GetSystemTimes(lpIdleTime, lpKernelTime, lpUserTime: LPFILETIME): BOOL; stdcall;
* **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).
====== Sources & Ressources ======
* [[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/]]