多个线程如何访问同一个控件,比如,每次开辟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;不知为什么
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;不知为什么
第一个问题“当开辟的线程总共超过950个时程序便处于“死机状态”了”应该怎么解决
volatile int iCounter=0;
UINT Athread(LPVOID lparam)
{
Section.Lock();
int IpPort = iCounter;
iCounter++;
PostMessage((HWND)lparam,WM_USER+10,0,0);
Section.Unlock();
return 0;
}
void CMainFrame::OnStart()
{
// TODO: 在此添加命令处理程序代码
HANDLE hThread[61];
CWinThread *pT[61];
//创建线程
for(int i=0;i<20;i++){
int a=0;
for(int k=0;k<60;k++)
{
if(iCounter>=950)
break;
pT[k]=NULL;
hThread[k]=NULL; pT[k]=AfxBeginThread(Athread,(LPVOID)GetSafeHwnd());
if(pT[k]!=NULL)
{
a++;
hThread[k]=pT[k]->m_hThread;
}
}
WaitForMultipleObjects(a,hThread,TRUE,INFINITE);
}
你的操作系统是不是2000的或XP 我的是98的
for(int k=0;k<60;k++)
{
if(iCounter>=950)
break;
pT[k]=NULL;
hThread[k]=NULL; pT[k]=AfxBeginThread(Athread,(LPVOID)GetSafeHwnd());
if(pT[k]!=NULL)
{
a++;
hThread[k]=pT[k]->m_hThread;
}
}
WaitForMultipleObjects(a,hThread,TRUE,INFINITE); //nobig60
这会让程式任何时刻所有的线程数不会超过60个,行nobig60会等到这a个线程都退出后才启动下a个,但是每次这a个线程都往目标窗口发一个消息后退出,以致于你点按钮后,目标窗口要响应那么多次(发送的消息数大于1000),要加1000个item,如果有sort风格还要排序,更新视图...当然慢了.我不知你做的是什么,要是我的话,我会边启动线程边处理消息,比如让等待动作放在消息处理函数中,这样才真正达到多线程的目的.如果你非要这么做的话,建议在启动线程前用对CListBox实行InitStorage(..),一定对程序的性能大有提高,详见msdn.