if(pThPool->m_fFunc) pThPool->m_fFunc(WM_THREADEND,sTh);
delete sTh;
CloseHandle(sTh->m_hThread);
break;
}
case WM_THREADADD:
{
CThreadPool::spThread sTh=new CThreadPool::sThread;
sTh->m_dRetval=0;
sTh->m_hThread=0;
sTh->m_fFunc=(ThreadFunc)msg.wParam;
sTh->m_vParam=(LPVOID)msg.lParam;
EnterCriticalSection(&(pThPool->m_cs));
pThPool->m_qWait.push_back(sTh);
LeaveCriticalSection(&(pThPool->m_cs));
break;
}
case WM_THREADPOOLIDIL:
{
goto IDIL;
}
}
}
else
{
IDIL: vector
for(int i=0;i
DWORD iExitCode;
GetExitCodeThread(vObj[i]->m_hThread,&iExitCode);
if(iExitCode!=STILL_ACTIVE)
{
vObj[i]->m_dRetval=iExitCode;
PostThreadMessage(dwCurId,WM_THREADEND,(WPARAM)vObj[i],0);
vObj.erase(vObj.begin()+i);
i--;
}
if(vObj.size()
{
int nCount=pThPool->m_nMaxThreadCount-vObj.size();
while(nCount)
{
if(pThPool->m_qWait.size()>0)
{
EnterCriticalSection(&(pThPool->m_cs));
vObj.push_back(pThPool->m_qWait[0]);
pThPool->m_qWait.erase(pThPool->m_qWait.begin());
LeaveCriticalSection(&(pThPool->m_cs));
PostThreadMessage(dwCurId,WM_THREADSTART,(WPARAM)vObj[vObj.size()-1],0);
while(1)
{
MSG msgtemp;
PeekMessage(&msgtemp,0,WM_THREADSTART,WM_THREADPOOLIDIL,PM_NOREMOVE);
if(msgtemp.message!=WM_THREADSTART)
{
PeekMessage(&msgtemp,0,WM_THREADSTART,WM_THREADPOOLIDIL,PM_REMOVE);
PostThreadMessage(dwCurId,msgtemp.message,msgtemp.wParam,msgtemp.lParam);
}
else
{
break;
}
}
}
else
{
break;
}
nCount--;
}
}
}
}