Как программно получить количество потоков для процесса Windows? - PullRequest
1 голос
/ 11 ноября 2010

Я хочу посчитать собственные потоки текущего процесса Windows через C / C ++.Я вижу, что есть связанный вопрос с ответом .NET, но я не могу использовать это решение.Я подозреваю, что может быть решение через PdhOpenQuery / PdhCollectQueryData, но я еще не исследовал это направление, и я надеюсь, что есть более простой подход.

ОБНОВЛЕНИЕ: я должен был сказать, что моя текущая реализация использует CreateToolhelp32Snapshot / Thread32First / Thread32Next, и это то, что я пытаюсь заменить.Эта реализация сложна и вызывает 20 000 сбоев страниц при каждом вызове в моем процессе.Может быть, я просто неправильно его использую?

Обновление 2. Лучшим решением для меня было создать строку типа "\ Process ( _) \ Thread Count" с PID процесса, который ябыл заинтересован. Затем я вызвал PdhExpandWildCardPath (), чтобы развернуть подстановочный знак "".Затем я вызвал PdhOpenQuery (), PdhAddCounter () и PdhCollectQueryData () для инициализации.После этого я вызвал PdhCollectQueryData () и PdhGetFormattedCounterValue (), чтобы периодически получать мои значения.

Ответы [ 2 ]

2 голосов
/ 11 ноября 2010

РЕДАКТИРОВАТЬ второе: ваш текст говорит «текущий процесс». Если это действительно так, вы можете реализовать небольшую DLL, в которой DllMain поддерживает счетчик активных потоков, используя InterlockedDecrement (на DLL_THREAD_DETACH) и InterlockedIncrement (на DLL_THREAD_ATTACH).

Вы должны убедиться, что ваш процесс загружает эту DLL на ранних этапах, чтобы количество потоков начиналось с 1 для нашего основного потока. Тогда ваш счетчик потоков всегда актуален и быстро доступен через Interlocked* API.

РЕДАКТИРОВАТЬ: Для повышения производительности, вы можете получить доступ к счетчикам PerfMon для вашего процесса и получить счетчик потоков для данного процесса за один выстрел. Здесь есть VB-код , который можно смоделировать.

Вы также можете использовать WMI для перечисления потоков по процессам, но это вряд ли простая модель программирования.

PerfMon будет самым быстрым.

ОРИГИНАЛ: У Раймонда Чена есть точные инструкции для этого здесь . Просто нужно отфильтровать по идентификатору процесса, совпадающему с вашим собственным (полученным через GetCurrentProcessId ) в условии до 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;
}
1 голос
/ 11 ноября 2010

ToolHelp API предоставляет набор функций для перечисления потоков.Используя Thread32First и Thread32Next вы можете рассчитывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...