РЕДАКТИРОВАТЬ второе: ваш текст говорит «текущий процесс». Если это действительно так, вы можете реализовать небольшую 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;
}