今天理解了 WaitForSingleObject(ha,INFINITE); 函数下, 当线程函数都执行完毕后,才执行后面的代码。 写了下线程函数.
CArray<stThreadInfo*, stThreadInfo*> m_arrThreadInfo;
DWORD WINAPI ThreadCalFunc(LPVOID lpParam)
{
stThreadInfo* pParam = (stThreadInfo*)lpParam;
int nTmpt=0;
for(int i=0;i<= pParam->num;i++)
{
nTmpt=nTmpt+i;
}
pParam->result = nTmpt;
return 0;
}
//
// 开始计算
//
void CMUltithreadTestDlg::OnBtncal()
{
for (int i = 30; i < 100; i+= 20)
{
stThreadInfo *pTInfo = new stThreadInfo();
pTInfo->num = i;
int dwThreadId = 0 ;
HANDLE hd = ::CreateThread(NULL,0,ThreadCalFunc,(LPVOID)pTInfo,CREATE_SUSPENDED,(LPDWORD)&dwThreadId);
pTInfo->ha = hd;
m_arrThreadInfo.Add(pTInfo);
::ResumeThread(hd);
}
当运行完上面的for 循环后,调试时只进入了一次线程韩式使用的num 是70l,
之后进入下面的for 当在WaitForSingleObject时 再次进入线程函数 num30,num90,num50,
然后出了for 执行下面的 显示函数.
for( i = 0 ; i < m_arrThreadInfo.GetSize();i++)
{
HANDLE ha = m_arrThreadInfo[i]->ha;
WaitForSingleObject(ha,INFINITE);
}
for( i = 0 ; i < m_arrThreadInfo.GetSize();i++)
{
long Result = m_arrThreadInfo[i]->result;
CString strtmp;
strtmp.Format("%d",Result);
if(i == 0)
SetDlgItemText(IDC_STATIC1,strtmp);
else if(i == 1)
SetDlgItemText(IDC_STATIC2,strtmp);
else if(i == 2)
SetDlgItemText(IDC_STATIC3,strtmp);
else if(i == 3)
SetDlgItemText(IDC_STATIC4,strtmp);
}
}