线程等待问题

[复制链接]
查看11 | 回复7 | 2021-1-27 06:09:31 | 显示全部楼层 |阅读模式
每一次调用a函数就创建一个工作线程,然后继续外层的循环,如何知道哪个之前创建的线程返回了,并且把对应的句柄关闭。
voida()
{
hThread[m_ThreadCount++]=CreateThread(NULL,NULL,abc,szFormatPath,0,&dwID1);
}

voidc()
{
while(1)
{
a();
...
}
}
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
waitformultiobject
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
在线程函数return之前写一行代码,通知线程返回
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
WaitForMultipleObjects(),注意线程数量不要超过最大数MAXIMUM_WAIT_OBJECTS
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
DWORDCThreadTest::Wait(DWORDdwMilliseconds,DWORD&dwErr)
{
while(NULL!=m_ph[0])
{
DWORDdwRet=::WaitForMultipleObjects(m_iCount,m_ph,FALSE,dwMilliseconds);
switch(dwRet)
{
caseWAIT_TIMEOUT:
{
OutputDebugString("WAIT_TIMEOUT.\n");
}
returnm_iCount;
caseWAIT_FAILED:
{
dwErr=::GetLastError();
charszErr[256]={'\0'};
sprintf(szErr,"%s%d.\n","WaitForMultipleObjectsfail.Err:",dwErr);
OutputDebugString(szErr);
}
return-1;
//等待到一个返回的线程,关闭句柄,计数减一,句柄数组左移.
default:
{
intindex=dwRet-WAIT_OBJECT_0;
::CloseHandle(m_ph[index]);
m_ph[index]=NULL;
--m_iCount;
for(;(index<m_iCount)&&(index!=m_iSize-1);++index)
{
m_ph[index]=m_ph[index+1];
}
}
break;
}
}
returnm_iCount;
}
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
假如说WaitForMultipleObjects超时后继续下次循环,那么之前循环中创建的线程结束了,这时能收到该线程的返回值么
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
只要有线程句柄,就可以用GetThreadExitCode得到退出状态
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
不知道你要做什么,这个也许你有用,
http://download.csdn.net/source/2801344
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行