我用CAsysocket类编写socket 通讯程序,当socket接收到数据后,我用afxbeginthread生成一个线程用来处理接收到的数据,最多可生成20个线程。
我用ado进行数据库的连接,我预先生成了10各数据连接,每次调用一个,最多调用10个连接,在程序中我还用到了ontimer函数。请问,我的程序问题有可能出现在哪里。

解决方案 »

  1.   

    不是,是接收了一段时间的数据后,没反应的的。机器一切都正常,cpu叶正常
      

  2.   

    OnRec()
    {
    .....
    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;
    }
      

  3.   

    可是我的机器的cpu却很正常啊,不像是死循环
      

  4.   

    问题我不清楚,但是有必要每接收到数据就开线程吗?
    莫非你的每次接收的数据都以数十MB记?buffer也有数十MB大?
    其实对于internet上的数据,一个线程处理足矣。千兆局域网的没做过,不敢说。
      

  5.   

    to jiangxuchina(hope)
    可是我的机器的cpu却很正常啊,不像是死循环那估计就是在某个WaitForSingleObject里了。