用什么方法可以得到在当前进程中的线程个数?

woshizei 2005-09-12 10:16:00
要用什么方法可以得到在当前进程中的线程个数呢?
...全文
341 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
a341869094 2010-05-31
  • 打赏
  • 举报
回复
太需要这贴了。。
he_sl 2005-09-13
  • 打赏
  • 举报
回复
学习
bager 2005-09-13
  • 打赏
  • 举报
回复
最后提供的代码已经验证通过。测试代码如下:
void ThreadFun()
{
while (1)
{
Sleep(1000);
}
}
void CGetThreadNumDemoDlg::OnOK()
{
DWORD dwProcessID = GetCurrentProcessId();
DWORD dwThreadNum = 0;
CString strThreadNum;

DWORD dwThreadID = 0;
HANDLE hThread[10];
for (int n=0;n<10;n++)
{
GetProcessThreadNum(dwProcessID,dwThreadNum);
hThread[n]=CreateThread(
NULL,NULL,
(LPTHREAD_START_ROUTINE )ThreadFun,
NULL,NULL,&dwThreadID);
strThreadNum.Format("%d",dwThreadNum);
AfxMessageBox(strThreadNum);
}
}

请确认一下你创建的线程是否没有退出。(从任务管理器中可以察看你的进程所拥有的线程数目)
woshizei 2005-09-13
  • 打赏
  • 举报
回复
多谢bager朋友的帮助.

我在我的机器上在创建了2个线程之后,得到的结果还是1.

这个函数你在你的机器上实验过吗?结果是否正确.

我怕是我在调用的时候写错了什么!
bager 2005-09-13
  • 打赏
  • 举报
回复
原来如此。
MSDN上说的没错,应该是我提供的那个函数中的逻辑处理作怪吧。如下:
===========================================================
do
{
if (pe32.th32ProcessID == dwProcessID) //
{
dwThreadNum = pe32.cntThreads;
break;
}
} while( Process32Next( hProcessSnap, &pe32 ) );
===========================================================
windcsn 2005-09-13
  • 打赏
  • 举报
回复
mark
woshizei 2005-09-13
  • 打赏
  • 举报
回复
我已经找到原因了.

是因为我将0传递给了函数的第一个参数dwProcessID造成的.我将0换成GetCurrentProcessId()就对了.
但MSDN上明明写着对当前进程调用CreateToolhelp32Snapshot是可以传0的.难道是改了.

多谢bager的耐心帮助,高人哪!一定要向你多多学习.
吹泡泡的小猫 2005-09-12
  • 打赏
  • 举报
回复
使用CreateToolhelp32Snapshot之前要调整权限,如果想访问system进程就需要至少是debug权限
bager 2005-09-12
  • 打赏
  • 举报
回复
void GetProcessThreadNum(DWORD dwProcessID,DWORD &dwThreadNum)
{
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;

hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, dwProcessID );
if( hProcessSnap == INVALID_HANDLE_VALUE )
{
AfxMessageBox(_T( "CreateToolhelp32Snapshot (of processes)" ));
return;
}

// Set the size of the structure before using it.
pe32.dwSize = sizeof( PROCESSENTRY32 );

// Retrieve information about the first process,
// and exit if unsuccessful
if( !Process32First( hProcessSnap, &pe32 ) )
{
CloseHandle( hProcessSnap ); // Must clean up the snapshot object!
return;
}
dwThreadNum = pe32.cntThreads;

CloseHandle( hProcessSnap );
}
bager 2005-09-12
  • 打赏
  • 举报
回复
非常抱歉,刚提供的代码有问题,已经修正。如下所示:

void GetProcessThreadNum(DWORD dwProcessID,DWORD &dwThreadNum)
{
HANDLE hProcessSnap;
PROCESSENTRY32 pe32;

hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, dwProcessID );
if( hProcessSnap == INVALID_HANDLE_VALUE )
{
AfxMessageBox(_T( "CreateToolhelp32Snapshot (of processes)" ));
return;
}

// Set the size of the structure before using it.
pe32.dwSize = sizeof( PROCESSENTRY32 );

// Retrieve information about the first process,
// and exit if unsuccessful
if( !Process32First( hProcessSnap, &pe32 ) )
{
CloseHandle( hProcessSnap ); // Must clean up the snapshot object!
return;
}

do
{
if (pe32.th32ProcessID == dwProcessID)
{
dwThreadNum = pe32.cntThreads;
break;
}
} while( Process32Next( hProcessSnap, &pe32 ) );

CloseHandle( hProcessSnap );
}
goodname008 2005-09-12
  • 打赏
  • 举报
回复
再好好查查Tool Help函数集的用法。

CreateToolhelp32Snapshot
Heap32First
Heap32ListFirst
Heap32ListNext
Heap32Next
Module32First
Module32Next
Process32First
Process32Next
Thread32First
Thread32Next
Toolhelp32ReadProcessMemory
woshizei 2005-09-12
  • 打赏
  • 举报
回复
不对呀!
我调用void GetProcessThreadNum(DWORD dwProcessID,DWORD &dwThreadNum)函数,按照MSDN上写的将第一个参数设为0.但我明明创建了2个线程,而函数返回的结果却总是1.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧