Comment puis-je calculer l'utilisation du processeur et du disque d'un autre programme concurrent? C'est à dire. un programme est en cours d'exécution et l'autre calcule l'utilisation des ressources du premier. J'utilise C et C++ et s'exécute sous Windows Xp.Surveillance de l'utilisation du processeur et du disque d'un seul programme
Répondre
Il est possible, comme Process Explorer peut le faire, mais je pense que vous devrez utiliser une sorte d'API Windows non documentée. PSAPI est assez proche, mais il ne vous donne que l'information sur l'utilisation de la mémoire, pas sur l'utilisation du processeur ou du disque.
En ce qui concerne l'utilisation de l'UC, il n'est pas difficile à faire après avoir jeté un oeil à ce lien Windows C++ Get CPU and Memory Utilisation With Performance Counters. Pour autant que je comprends (mais n'ai pas testé), il est également possible de trouver l'utilisation du disque.
L'idée est d'utiliser Performance Counters. Dans votre situation, vous devez utiliser le compteur de performance L"\\Process(program_you_are_interested_in_name)\\% Processor Time"
pour l'utilisation du processeur et éventuellement pour les opérations sur disque. Comme je ne suis pas sûr des paramètres que vous devez savoir exactement sur les opérations disque, vous pouvez regarder la liste de tous les paramètres disponibles: Process Object
Si par exemple vous avez un programme concurrent avec le nom a_program_name.exe
, vous pouvez trouver son Utilisation de l'UC mesurant au moins deux fois le compteur de performance L"\\Process(a_program_name)\\% Processor Time"
. Dans l'exemple, cela se fait en boucle. Par ailleurs, mesurer avec ce test une application multithread s'exécutant sur un processeur multicœur peut donner une utilisation du processeur supérieure à 100%.
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <string.h>
#include <string>
#include <iostream>
// Put name of your process here!!!!
CONST PWSTR COUNTER_PATH = L"\\Process(a_program_name)\\% Processor Time";
void main(int argc, char *argv[]){
PDH_HQUERY hquery;
PDH_HCOUNTER hcountercpu;
PDH_STATUS status;
LPSTR pMessage;
PDH_FMT_COUNTERVALUE countervalcpu;
if((status=PdhOpenQuery(NULL, 0, &hquery))!=ERROR_SUCCESS){
printf("PdhOpenQuery %lx\n", status);
goto END;
}
if((status=PdhAddCounter(hquery,COUNTER_PATH,0, &hcountercpu))!=ERROR_SUCCESS){
printf("PdhAddCounter (cpu) %lx\n", status);
goto END;
}
/*Start outside the loop as CPU requires difference
between two PdhCollectQueryData s*/
if((status=PdhCollectQueryData(hquery))!=ERROR_SUCCESS){
printf("PdhCollectQueryData %lx\n", status);
goto END;
}
while(true){
if((status=PdhCollectQueryData(hquery))!=ERROR_SUCCESS){
printf("PdhCollectQueryData %lx\n", status);
goto END;
}
if((status=PdhGetFormattedCounterValue(hcountercpu, PDH_FMT_LONG | PDH_FMT_NOCAP100, 0, &countervalcpu))!=ERROR_SUCCESS){
printf("PdhGetFormattedCounterValue(cpu) %lx\n", status);
goto END;
}
printf("cpu %3d%%\n", countervalcpu.longValue);
Sleep(1000);
}
END:
;
}
Il y a encore une chose à mentionner. PdhExpandWildCardPath
permet d'étendre une chaîne de ce type L"\\Process(*)\\% Processor Time"
dans une liste de processus s'exécutant sur un ordinateur. Et puis vous pouvez interroger les compteurs de performance pour chaque processus.
"Je veux le code" est quelque chose que vous dites quand vous êtes un gestionnaire de programmeurs dans une entreprise. Tu sais, travail. Nous aidons, ne travaillons pas. :) – GManNickG
GMan: Trop vrai. Ai-je été si dur que mes yeux réinterprètent cela maintenant? Je pense qu'il est commun pour les non-anglophones d'utiliser cette expression quand ils veulent dire qu'ils veulent de l'aide ou de savoir quelles API ("le code") sont utiles. –
'top'? ________ – kennytm