Comment faire pour obtenir l'utilisation de l'uc par thread sur windows (win32)
À la recherche pour les fonctions de l'API Win32, C++ ou Delphi exemple de code qui me dit que l'utilisation du PROCESSEUR (en pourcentage et/ou totale de l'unité centrale) d'un thread (et non pas la totalité d'un processus). J'ai l'ID de thread.
Je sais que Sysinternals Process Explorer peut afficher cette information, mais j'ai besoin de cette information à l'intérieur de mon programme.
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser ces fonctions pour obtenir l'utilisation de l'uc par des threads et processus.
GetThreadTimes (Extrait des informations de synchronisation pour le thread spécifié.)
GetProcessTimes (Extrait des informations de synchronisation pour le processus spécifié.)
Fonction getsystemtime (Extrait le système actuel de la date et de l'heure. Le système de temps est exprimé en Temps Universel Coordonné UTC)
Ici un excellent article du Dr Dobb's Win32 Mesure De La Performance Des Options
Bye.
Les données que vous y référant est disponible à l'aide spécifique WMI appels. Vous pouvez interroger Win32_Process pour obtenir toutes sortes de processus spécifiques d'information, de requête et de Win32_PerfFormattedData_PerfProc_process pour obtenir le nombre de threads, et compte tenu d'une poignée pour un thread (ce que je crois à votre recherche vous pouvez interroger Win32_PerfRawData_PerfProc_Thread pour obtenir le pourcentage de temps processeur utilisé.
Il y a un bibliothèque à disposition de Delphi qui fournit des wrappers pour la plupart des requêtes WMI, cependant, il faudra quelques essais pour obtenir la requête de votre recherche. La syntaxe de la requête est très sql comme, par exemple, sur mon système, pour retourner le pourcentage de temps processeur pour threadid 8, pour l'id de processus 4 est:
La plupart des programmes qui présentent de l'information statistique sur les processus en cours d'exécution maintenant utiliser WMI pour la requête de cette information.
Est important de savoir que, dans certaines situations, le temps d'exécution d'un thread peut être sans valeur.
Le temps d'exécution de chaque thread sont mises à jour toutes les 15 millisecondes généralement pour les systèmes multi-core, de sorte que si un thread termine son travail avant ce temps, le moteur d'exécution seront remis à zéro.
Plus de détails peuvent être obtenus sur le lien:
GetThreadTimes fonction et j'ai été surpris par le résultat!
Pourquoi GetThreadTimes est faux
Avec l'aide de RRUZ la réponse ci-dessus, j'ai enfin trouvé ce code pour Borland Delphi:
À L'Aide De "GetThreadTimes"? Si vous mesurez le temps entre les appels à "GetThreadTimes" et le magasin de la précédente utilisateur et/ou le noyau fois, alors vous savez combien de temps le fil depuis votre dernière vérification. Vous savez aussi combien de temps s'est écoulé dans le temps, et ainsi vous pouvez savoir combien de temps PROCESSEUR utilisé. Il serait préférable (pour la résolution du timer raisons pour cela, vérifiez toutes les secondes et le travail de son utilisation moyenne du PROCESSEUR au cours de cette seconde.
Ici est une simple requête WMI wrapper. Avec l'aide de ce que vous pouvez appeler pour obtenir des données:
Aussi, vous voudrez peut-être regarder à l' Win32_PerfRawData_PerfProc_Thread de la documentation pour voir ce que d'autres propriétés que vous pouvez récupérer.
Cet exemple utilise
GetProcessTimes()
mais peut facilement être modifié pour utiliserGetThreadTimes()
.ISO C
clock()
est CENSÉ vous donner écoulé CPU-secondes lorsqu'il est divisé parCLOCKS_PER_SEC
. Cependant Visual Studio 2019 page web dit:Donc, ici, c'est un stand-in que j'ai fait. Sur Windows 7/Visual Studio 2017,
CLOCKS_PER_SEC
est de 1000 etGetProcessTimes()
seulement a une précision à la milliseconde, donc pas de précision est perdu retourclock_t
au lieu dedouble
, dire.Et pour être complet, voici AKGetLastError():