2010-11-11 4 views
1

Je souhaite compter les threads natifs du processus Windows en cours via C/C++. Je vois qu'il y a un related question avec une réponse .NET, mais je ne peux pas utiliser cette solution. Je soupçonne qu'il peut y avoir une solution via PdhOpenQuery/PdhCollectQueryData mais je n'ai pas encore exploré cette direction, et j'espère qu'il y aura une approche plus facile. MISE À JOUR: J'aurais dû dire que mon implémentation actuelle utilise CreateToolhelp32Snapshot/Thread32First/Thread32Next et c'est ce que j'essaie de remplacer. Cette implémentation est lourde et provoque 20 000 fautes de page à chaque invocation dans mon processus. Peut-être que je l'utilise mal?Comment puis-je obtenir par programmation les nombres de threads pour un processus Windows?

Update2: La solution qui a fonctionné le mieux pour moi était de faire une chaîne comme "\ Process (_) \ Thread Count" avec le PID du processus qui m'intéressait. Puis j'ai appelé PdhExpandWildCardPath() pour développer le "" caractère générique. Puis j'ai appelé PdhOpenQuery(), PdhAddCounter() et PdhCollectQueryData() pour initialiser. Par la suite, j'ai appelé PdhCollectQueryData() et PdhGetFormattedCounterValue() pour obtenir mes valeurs périodiquement.

Répondre

2

EDITER la seconde: Votre texte dit "processus en cours". Si tel est le cas, vous pouvez implémenter une petite DLL dont DllMain maintient un compteur de thread actif en utilisant InterlockedDecrement (sur DLL_THREAD_DETACH) et InterlockedIncrement (sur DLL_THREAD_ATTACH).

Vous devez vous assurer que votre processus charge cette DLL au début de sorte que le nombre de threads commence à 1 pour notre thread principal. Ensuite, le nombre de threads est toujours à jour et rapidement accessible via les API Interlocked*.

EDIT: Pour améliorer les performances, vous pouvez accéder aux compteurs PerfMon pour votre processus et obtenir le nombre de threads pour un processus donné en une seule fois. Il y a le code VB here que vous pourriez modéliser.

Vous pouvez également utiliser WMI pour énumérer les threads par processus, mais ce n'est pas un modèle de programmation facile.

PerfMon sera le plus rapide.

ORIGINAL: Raymond Chen a des instructions exactes pour ce here. Juste besoin de filtrer par ID de processus correspondant à votre propre (obtenu via GetCurrentProcessId) dans la condition avant le printf.

#include <stdio.h> 
#include <windows.h> 
#include <tlhelp32.h> 

int __cdecl main(int argc, char **argv) 
{ 
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); 
if (h != INVALID_HANDLE_VALUE) { 
    THREADENTRY32 te; 
    te.dwSize = sizeof(te); 
    if (Thread32First(h, &te)) { 
    do { 
    if (te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + 
         sizeof(te.th32OwnerProcessID)) { 
     printf("Process 0x%04x Thread 0x%04x\n", 
      te.th32OwnerProcessID, te.th32ThreadID); 
    } 
    te.dwSize = sizeof(te); 
    } while (Thread32Next(h, &te)); 
    } 
    CloseHandle(h); 
} 
return 0; 
} 
+0

Merci, je viens de mettre à jour la question pour indiquer que votre solution est ce que j'utilise actuellement aujourd'hui, mais je cherche quelque chose de plus performant. Ou peut-être que je suis trop préoccupé par les conséquences de la panne de page de cette solution? –

+0

@Chris - voir edit - Perfmon utilise généralement la mémoire partagée et cela devrait être rapide. –

+0

@Chris - J'ai une idée de plus pour vous, en éditant cela maintenant –

1

L'API ToolHelp fournit un ensemble de fonctions pour énumérer les threads. En utilisant Thread32First et Thread32Next vous pouvez compter.

+0

Merci, j'ai mis à jour la question pour mentionner cette solution. –

Questions connexes