多个线程如何访问同一个控件
多个线程如何访问同一个控件,比如,每次开辟60个线程,往一个控件写入数据,等这60个线程结束,再开辟60个线程也往这个控件写数据。代码如下,当开辟的线程总共超过950个时程序便处于“死机状态”了。不知为什么
CCriticalSection Section;
volatile int iCounter=0;
UINT threadA(LPVOID pParam)
{
CxxxDlg *threada=(CxxxDlg*)pParam;
Section.Lock();
int IpPort = iCounter;
iCounter++;
::PostMessage(threada->GetSafeHwnd(),WM_USER_RECALC_DONE,IpPort,0);
Section.Unlock();
return 0;
}
void CxxxDlg::OnButton1()
{
// TODO: Add your control notification handler code here
m_list.ResetContent();
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
UpdateData(TRUE);
int v;
if(m_Eport == m_Sport)//m_Eport m_Sport 都是int类型,例如//m_Sport=0,m_Eport=950;
v = 1;
else
{
v = (m_Eport-m_Sport)/60;
if( ( (m_Eport-m_Sport)%60 ) > 0 )
v++;
}
HANDLE hThread[61];
CWinThread *pT[61];
iCounter = m_Sport;
//创建线程
for(int i=0;i<v;i++){
int a=0;
for(int k=0;k<60;k++)
{
a++;
if(iCounter>=m_Eport)
break;
pT[k]=AfxBeginThread(threadA,this);
hThread[k]=pT[k]->m_hThread;
}
WaitForMultipleObjects(a,hThread,TRUE,INFINITE);
}
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
}
LRESULT CxxxDlg::OnRecalcDone(WPARAM wParam, LPARAM lParam)
{
int a=(int)wParam;
char bb[10];
memset(bb,0,10);
itoa(a,bb,10);
m_list.AddString(bb);
return 0;
}
把PostMessage换成SendMessage()总共开辟两三个线程程序便处于死机状态,比如m_Sport=0,m_Eport=3;不知为什么