2009-09-08 3 views

Répondre

5

Avec l'aide de la réponse de RRUZ ci-dessus, je suis finalement arrivé avec ce code pour Borland Delphi:

const 
    THREAD_TERMINATE     = $0001; 
    THREAD_SUSPEND_RESUME   = $0002; 
    THREAD_GET_CONTEXT    = $0008; 
    THREAD_SET_CONTEXT    = $0010; 
    THREAD_SET_INFORMATION   = $0020; 
    THREAD_QUERY_INFORMATION   = $0040; 
    THREAD_SET_THREAD_TOKEN   = $0080; 
    THREAD_IMPERSONATE    = $0100; 
    THREAD_DIRECT_IMPERSONATION  = $0200; 
    THREAD_SET_LIMITED_INFORMATION = $0400; 
    THREAD_QUERY_LIMITED_INFORMATION = $0800; 
    THREAD_ALL_ACCESS    = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $03FF; 

function OpenThread(dwDesiredAccess: DWord; 
        bInheritHandle: Bool; 
        dwThreadId: DWord): DWord; stdcall; external 'kernel32.dll'; 


procedure TForm1.Button1Click(Sender: TObject); 
var iii:integer; 
    handle:thandle; 
    creationtime,exittime,kerneltime,usertime:filetime; 
begin 
    Handle:=OpenThread(THREAD_SET_INFORMATION or THREAD_QUERY_INFORMATION, False, windows.GetCurrentThreadId); 
    if handle<>0 then 
    begin 
    getthreadtimes(Handle,creationtime,exittime,kerneltime,usertime); 
    label1.caption:='Total time for Thread #'+inttostr(windows.GetCurrentThreadId)+': '+inttostr((int64(kerneltime)+int64(usertime)) div 1000)+' msec'; 
    CloseHandle(Handle); 
    end; 
end; 
+0

Mais cela ne vous donne que le temps passé à l'exécution du thread, et non le pourcentage d'utilisation du processeur. Vous pouvez également obtenir le temps total à partir des appels WMI avec le pourcentage dans une seule requête. – skamradt

+0

Je pense que vous pouvez déduire la quantité d'utilisation de cpu en interrogeant chaque seconde et, si son "noyau + usertime" augmente de 1.0 ce qui implique qu'il a utilisé 100% d'un noyau pour cette seconde, oui? – rogerdpack

3

L'utilisation de "GetThreadTimes"? Si vous mesurez le temps entre les appels à "GetThreadTimes" et stockez l'utilisateur précédent et/ou les heures du noyau, alors vous savez combien de temps le thread a eu depuis la dernière vérification. Vous savez également combien de temps s'est écoulé entre temps et ainsi vous pouvez calculer combien de temps CPU a été utilisé. Il serait préférable (pour des raisons de résolution de minuterie) d'effectuer cette vérification toutes les secondes et de calculer l'utilisation moyenne de l'UC pendant cette seconde.

20

Vous devez utiliser ces fonctions pour obtenir l'utilisation du processeur par thread et processus.

GetThreadTimes (extrait des informations de synchronisation pour le fil spécifié.)

GetProcessTimes (extrait des informations de synchronisation pour le processus spécifié.)

GetSystemTime (extrait la date courante du système et du temps. Le temps de système est exprimée en Temps universel coordonné UTC)

Voici un excellent article du Dr Dobb de Win32 Performance Measurement Options

Au revoir.

+0

Lisez aussi la réponse de lsalamon pour noter que GetThreadTimes peut être "inférieur à la précision" – rogerdpack

9

Les données auxquelles vous faites référence sont disponibles avec des appels WMI spécifiques. Vous pouvez interroger Win32_Process pour obtenir toutes sortes d'informations spécifiques au processus et interroger Win32_PerfFormattedData_PerfProc_Process pour obtenir le nombre de threads, et étant donné un handle pour un thread (ce que je crois), vous pouvez interroger Win32_PerfRawData_PerfProc_Thread pour obtenir le pourcentage de temps processeur utilisé.

library available for Delphi Il existe un library available for Delphi qui fournit des wrappers pour la plupart des requêtes WMI, mais il faudra quelques expérimentations pour obtenir la requête exacte que vous recherchez. La syntaxe de requête est très sql comme, par exemple sur mon système pour renvoyer le pour cent du temps processeur pour threadid 8, pour l'ID de processus 4 est:

SELECT PercentProcessorTime FROM Win32_PerfRawData_PerfProc_Thread 
    WHERE IdProcess=4 and IdThread=8 

La plupart des programmes qui présentent des informations statistiques sur les processus en cours d'exécution utilisent maintenant WMI pour demander cette information.

6

est important de savoir que dans certaines situations, le temps d'exécution d'un fil peut être sans valeur. Les temps d'exécution de chaque thread sont mis à jour toutes les 15 millisecondes, généralement pour les systèmes multi-core, donc si un thread termine sa tâche avant cette heure, le runtime sera réinitialisé. Plus de détails peuvent être obtenus sur le lien: GetThreadTimes function and I was surprised by the result!
et Why GetThreadTimes is wrong

+3

Apparemment, dans Vista + vous pouvez appeler QueryThreadCycleTime pour plus de précision. http://stackoverflow.com/questions/5532046/c-getthreadtimes-but-with-a-better-resolution Je pense que Vista + GetThreadTimes est aussi plus précis, mais TBD. – rogerdpack

0

Here est un simple wrapper de requête WMI.Avec l'aide de celui-ci, vous pouvez appeler cela pour obtenir des données:

getWmiQueryResult(L"SELECT PercentProcessorTime FROM Win32_PerfRawData_PerfProc_Thread WHERE IdProcess=4 and IdThread=8", L"PercentProcessorTime "); 

Aussi, vous voudrez peut-être regarder la documentation Win32_PerfRawData_PerfProc_Thread pour voir ce que les autres propriétés que vous pouvez chercher.