線程中傳遞變量的問(wèn)題
初次寫多線程編程的時(shí)候,初學(xué)者很容易犯的錯(cuò)就是給線程傳遞變量的時(shí)候經(jīng)常出錯(cuò),
因?yàn)榫€程中被傳遞的變量的類型不同,其效果也不一樣。經(jīng)常采用的是分配新的內(nèi)存給變
量,傳遞這個(gè)新分配的內(nèi)存地址,因?yàn)橥粋€(gè)變量名,但是指向的內(nèi)存段不同,這樣能實(shí)
現(xiàn)正確地給多線程傳遞變量,注意的是在每一個(gè)線程結(jié)束的時(shí)候一定要把這個(gè)分配的內(nèi)存
釋放。
HANDLE mt[1000];
for(int i=0;i<50;i++)
{
pTI pti = new TI;
pti->pDlg = this;
pti->id = i;
pti->me = pti; //把自身的指針帶過(guò)去
pClockThread[i] = AfxBeginThread(ClockThread,pti);
mt[i] = pClockThread[i]->m_hThread;
ResumeThread(pClockThread[i]->m_hThread);
}
DWORD dw = WaitForMultipleObjects(3,mt,TRUE,INFINITE);
UINT ClockThread( LPVOID pParam )
{
pTI pti;
pti =(pTI) pParam;
CClockDlg *pDlg = (CClockDlg *)pti->pDlg;
CString str;
str.Format("log%02d.txt",pti->id);
FILE *fp;
fp = fopen(str,"wb");
for(int m=0;m<100;m++)
{
CTime t = CTime::GetCurrentTime();
str.Format("id = %02d %02d:%02d.%02d",pti->id,t.GetHour(),t.GetMinute(),t.GetSecond());
fwrite(str+"\r\n",1,str.GetLength()+2,fp);
CDC *pDC = pti->pDlg->GetDC();
if(pDC)
{
pDC->TextOut(20,pti->id*16,str);
pDlg->ReleaseDC(pDC);
}
Sleep(100);
}
fclose(fp);
delete pti->me;//釋放內(nèi)存
AfxEndThread(0,TRUE);
return 0;
}