我用CAsysocket类编写socket 通讯程序,当socket接收到数据后,我用afxbeginthread生成一个线程用来处理接收到的数据,最多可生成20个线程。
我用ado进行数据库的连接,我预先生成了10各数据连接,每次调用一个,最多调用10个连接,在程序中我还用到了ontimer函数。请问,我的程序问题有可能出现在哪里。
我用ado进行数据库的连接,我预先生成了10各数据连接,每次调用一个,最多调用10个连接,在程序中我还用到了ontimer函数。请问,我的程序问题有可能出现在哪里。
{
.....
GetThread();GetThread()
{
for(int i=0;i<20;i++)
{
if(theApp.ThreadList[i].flag==0)
{
StartThread(i);
return i;
}
}
return 21;
}
StartThread(int num)
{
switch(num)
{
case 0:
AfxBeginThread(RevThread0,this,THREAD_PRIORITY_ABOVE_NORMAL);
break;
case 1:
AfxBeginThread(RevThread1,this,THREAD_PRIORITY_ABOVE_NORMAL);
break;
..............
}
}
UINT RevThread0(LPVOID param)
{
theApp.ThreadList[0].flag=1;
int idatatype,iCount=0,i=0;
CString tempstr,port,data;
POSITION pos;
CString m_type;
int slen=0,snum=0,len=0,m_pos=0;
try
{
theApp.m_thread.Lock();
if(theApp.dataflag==1)
{
theApp.m_thread.Unlock();
theApp.ThreadList[0].flag=0;
return 0;
}
iCount=theApp.DataList.GetCount()/3;
if(iCount>0)
{
theApp.m_thread.Lock();//2
theApp.dataflag=1;
theApp.m_thread.Unlock();
pos=theApp.DataList.FindIndex(0);
idatatype=atoi(theApp.DataList.GetAt(pos));
m_type.Format("%d",idatatype);
pos=theApp.DataList.FindIndex(1);
port=theApp.DataList.GetAt(pos);
pos=theApp.DataList.FindIndex(2);
data=theApp.DataList.GetAt(pos);
theApp.DataList.RemoveHead();
theApp.DataList.RemoveHead();
theApp.DataList.RemoveHead();
theApp.m_thread.Lock();
theApp.dataflag=0;
theApp.m_thread.Unlock();
if(!data.IsEmpty())
{
switch(idatatype)
{
case 0:
DoWithUserInfo(m_type,port,data);
break;
case 1:
theApp.DoWithIpPack(m_type,port,data);
break;
case 2:
theApp.DoWithOfficeAck(m_type,port,data);
break;
case 3:
theApp.DoWithIEData(m_type,port,data);
break;
case 4:
theApp.DoWithSenceInfo(m_type,port,data);
break;
case 5:
theApp.DoWithFileAck(m_type,port,data);
break;
case 6:
theApp.DoWithAlarm(m_type,port,data);
break;
case 7:
theApp.DoWithAlarmRecover(m_type,port,data);
break;
case 8:
theApp.DoWithBureauAck(m_type,port,data);
break;
case 9:
theApp.DoWithMinInfo(m_type,port,data);
break;
case 10:
theApp.DoWithUps(m_type,port,data);
break;
case 11:
theApp.DoWithFileState(m_type,port,data);
break;
case 12:
theApp.DoWithSetTime(m_type,port,data);
break;
case 13:
theApp.DoWithOfficeIE(m_type,port,data);
break;
case 14:
theApp.DoWithRealData(m_type,port,data);
break;
case 15:
break;
case 16:
theApp.DoWithIPAck(m_type,port,data);
default:
break;
}
}
Sleep(50);
}
}
catch(...)
{
theApp.WriteToFile("RecThread error!");
}
theApp.ThreadList[0].flag=0;
AfxEndThread(0,TRUE);
return 0;
}
莫非你的每次接收的数据都以数十MB记?buffer也有数十MB大?
其实对于internet上的数据,一个线程处理足矣。千兆局域网的没做过,不敢说。
可是我的机器的cpu却很正常啊,不像是死循环那估计就是在某个WaitForSingleObject里了。