我用VC6写了一个MFC的远程控制软件,控制端是基于对话框的程序,用CListBox显示和索引所有的被控端IP地址 
进来的每个连接都分配一个通信线程,添加和删除ListBox字串用的DeleteString()和InsterString()。 
当控制端运行一段时间后,对话框的显示就出问题,好像是什么地方溢出了,莫非是显存?弄了很久都没解决,请高人指点。 
如图: 

解决方案 »

  1.   

    代码老长了~我把与listBox有关的代码贴出来//添加一个IP连接
    //¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö
    void AddClt()
    {
    //µÈ´ý½ÓÊÜsocket£¬from´æ·ÅÇëÇó·½µØÖ·½á¹¹£¬fromlen³¤¶È
    sockaddr_in from;
    struct timeval rcv_out;
    int fromlen=sizeof(from);
    SOCKET tmpS=accept(a_server,(sockaddr*)&from,&fromlen); rcv_out.tv_sec=5*60000; //ÉèÖÃrecv³¬Ê±Ê±¼ä(ºÁÃë)
    rcv_out.tv_usec=0;
    setsockopt(tmpS,SOL_SOCKET,SO_RCVTIMEO,(char*)&rcv_out,sizeof(rcv_out)); CString str,strWhere;
    for(int j=0;j<MAXclt;j++)
    {
    if(client[j].m_Socket==0) 
    {
    client[j].m_Socket=tmpS; 
    str.Format("\r\nWe have a connect! IP:¡¾%s¡¿",inet_ntoa(from.sin_addr));
    client[j].m_addr=from.sin_addr;
    SetEdit(a_pEdShowinfo,str);
    client[j].n_ID=j; strWhere.Format("%s",inet_ntoa(from.sin_addr));
    LocalityFromIP(strWhere);//²éѯµØÀíλÖÃ
    str.Format("%d> %s \t",j,inet_ntoa(from.sin_addr));
    str+=strWhere;
    EnterCriticalSection(&g_cs);
    a_pLB->DeleteString(j);
    a_pLB->InsertString(j,str);//Ö´ÐÐÍê¼´¸Ä±äÏÔʾÄÚÈÝ
    a_curtCltID=-1; a_nConnect++;
    LeaveCriticalSection(&g_cs);
    //´´½¨½ÓÊÕ¿Í»§¶ËÏûÏ¢µÄÏß³Ì
    HANDLE hMan1=CreateThread(NULL,0,ThreadProc_rcv,(LPVOID)&client[j],0,\
    (LPDWORD)&Thread_rcv[j]);
    CloseHandle(hMan1);
    Sleep(400);/* HANDLE hMan2=CreateThread(NULL,0,ThreadProc_snd,(LPVOID)&client[j],0,\
    (LPDWORD)&Thread_snd[j]);
    CloseHandle(hMan2);
    */
    return;
    }
    }
    }//每个IP连接的接收处理线程
    //¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö
    DWORD WINAPI ThreadProc_rcv(LPVOID param) //paramÊÇÖ¸ÏòsockteTable½á¹¹µÄÖ¸Õë
    {
    char rcv[B_RCVBUF];
    char SourceFile[MAX_PATH],DestFile[MAX_PATH];
    int i,len,dirlen,icon,newIconCount,ID;
    CString str;
    stream in;
    SYSTEMTIME oldTime,newTime;
    SOCKET *psock;
    SHFILEINFO shinfo; in.size=B_RCVBUF;
    in.data=(BYTE*)malloc(in.size);
    psock=&(*(SocketTable*)param).m_Socket;
    ID=    (*(SocketTable*)param).n_ID;
    PlaySound("IDR_Cnct",AfxGetResourceHandle(),SND_RESOURCE|SND_ASYNC|SND_NODEFAULT); 
    while(1)
    {
    //socketµÄ½ÓÊÕ»º³åÇøºÍrecv£¨£©ÀïµÄ»º³åÇø²»Í¬£¬recv²ÎÊýÀïµÄÊÇÎÒÃǶ¨ÒåµÄ¡£
    //socketµÄ½ÓÊÕ»º³åÇø²»Îª0£¬recv¾Í·µ»Ø,·µ»ØµÄÊÇÒƵ½ÎÒÃǶ¨ÒårcvÖеĵÄ×Ö½ÚÊý¡£
    memset(rcv,0,sizeof(rcv));
    len=recv(*psock,rcv,9,0); //×îºó²ÎÊýÈôΪMSG_PEEK£¬Ôò²»Çå³ýºËÐÄ»º³åÇø£¬ËÀÑ­»·
    if(len==0||len==-1)//
    {
    str.Format("\r\nIP:¡¾%s¡¿disconnect!",inet_ntoa((*(SocketTable*)param).m_addr));
    SetEdit(a_pEdShowinfo,str);
    closesocket(*psock);
    *psock=0; //½«SOCKET±íÖеÄm_socketÏàÓ¦ÇåÁã
    a_pLB->DeleteString(ID);//¸üÐÂÁбí¿ò
    str.Format("%d --------",ID);
    a_pLB->InsertString(ID,str);
    timerK[ID]=1;//»Ö¸´µÚn_ID¸öÁ¬½ÓΪ¿ÉÖ´ÐÐÃüÁî EnterCriticalSection(&g_cs);
    a_curtCltID=-1;
    a_nConnect--; //¿Í»§Êý¼õ1
    LeaveCriticalSection(&g_cs);
    free(in.data);
    return 1; //Ï̺߳¯Êý·µ»ØÖµÎÞËùν£¬Ö»Òª·µ»Ø£¬Ï߳̾Í×Ô¶¯½áÊø£¡
    }
    else
    {
    if(strcmp(rcv,"FILELIST_")==0)
    {
    SetEdit(a_pEdShowinfo,"\r\n>> ½ÓÊÕĿ¼...\t");
    timerK[ID]=1;//»Ö¸´Î¬³ÖÐźÅcommand_iµÄ·¢ËÍ
    memset(in.data,0,in.size);
    tcp_recv(*psock,&in,sizeof(int));
    dirlen=*(int*)(in.data);
    if(dirlen==0)
    {
    continue;  //Ŀ¼ÏÂÎÞ¶«Î÷£¬ÊÕµ½¾ÍÊÇ0£»
    }
    tcp_recv(*psock,&in,dirlen);
    //ɾ³ýa_hItemµÄ×ÓÏî,Èô×ÓÏîΪ¿Õ
    if(a_pDir_ip->GetItemText(a_pDir_ip->GetChildItem(a_hItem))=="")
    a_pDir_ip->DeleteItem(a_pDir_ip->GetChildItem(a_hItem)); //ÊÇĿ¼
    while(*(in.p))
    {
    if(*(char*)in.p=='?')
    {
    EnterCriticalSection(&g_cs);
    //ÔÚ½áµãhItemÉÏÌí¼ÓÏîÄ¿
    if(iconK==0)
    a_hSubItem=a_pDir_ip->InsertItem((char*)(in.p+sizeof(char)),0,0,a_hItem);
    else
    a_hSubItem=a_pDir_ip->InsertItem((char*)(in.p+sizeof(char)),1,1,a_hItem);
    a_pDir_ip->InsertItem("",a_hSubItem);
    LeaveCriticalSection(&g_cs);
    }
    in.p+=strlen((char*)in.p)+1;
    } //ÊÇÎļþ
    in.p=in.data;
    while(*(in.p))
    {
    EnterCriticalSection(&g_cs);
    if(*(char*)in.p!='?')
    {
    SHGetFileInfo((char*)(in.p+sizeof(char)), FILE_ATTRIBUTE_NORMAL,
    &shinfo,sizeof(shinfo), \
    SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_SMALLICON|SHGFI_USEFILEATTRIBUTES); newIconCount=iconCount;
    for(i=0;i<newIconCount;i++)
    {
    if(icontb[i].iIcon==shinfo.iIcon) //ͼ±ê¾ä±úÿ¸öÎļþ¶¼²»Í¬
    {
    icon=icontb[i].imgID;
    break;
    }
    if(i==iconCount-1)
    {
    icon=a_img.Add(shinfo.hIcon);
    icontb[i].imgID=icon;
    icontb[i].iIcon=shinfo.iIcon;
    icontb[i+1].iIcon=0;
    if(iconCount<100)
    iconCount++;
    }
    }
    a_pDir_ip->InsertItem((char*)(in.p+sizeof(char)),icon,icon,a_hItem);
    }
    LeaveCriticalSection(&g_cs);
    in.p+=strlen((char*)in.p)+1;
    }
    SetEdit(a_pEdShowinfo,"\t\tok!");
    iconK++;
    } if(strcmp(rcv,"UP_READY_")==0)
    {
    memset(SourceFile,0,MAX_PATH);
    ::GetDlgItemText(a_hDlg,IDC_EDIT_Lpath,SourceFile,MAX_PATH);
    SendFile(*psock,SourceFile);
    } if(strcmp(rcv,"UFILE_OK_")==0)
    {
    ::SetDlgItemText(a_hDlg,IDC_fileOK,"ÉÏ´«³É¹¦!");
    Sleep(4000);
    ::SetDlgItemText(a_hDlg,IDC_fileOK,"");
    timerK[ID]=1;
    }
    if(strcmp(rcv,"UFILE_NO_")==0)
    {
    ::SetDlgItemText(a_hDlg,IDC_fileNO,"ÉÏ´«Ê§°Ü!");
    Sleep(4000);
    ::SetDlgItemText(a_hDlg,IDC_fileNO,"");
    timerK[ID]=1;
    } if(strcmp(rcv,"DN_READY_")==0)
    {
    ::GetDlgItemText(a_hDlg,IDC_EDIT_Lpath,DestFile,MAX_PATH);
    str=DestFile+a_pDir_ip->GetItemText(a_pDir_ip->GetSelectedItem());
    if(RecvFile(*psock,str.GetBuffer(1)))
    {
    ::SetDlgItemText(a_hDlg,IDC_fileOK,"ÏÂÔسɹ¦!");
    Sleep(4000);
    ::SetDlgItemText(a_hDlg,IDC_fileOK,"");
    }
    else
    {
    ::SetDlgItemText(a_hDlg,IDC_fileNO,"ÏÂÔØʧ°Ü!");
    Sleep(4000);
    ::SetDlgItemText(a_hDlg,IDC_fileNO,"");
    }
    timerK[ID]=1;
    } if(strcmp(rcv,"RUNTIMES_")==0)
    {
    memset(&oldTime,0,sizeof(oldTime));
    memset(&newTime,0,sizeof(newTime));
    recv(*psock,(char*)&oldTime,sizeof(SYSTEMTIME),0);
    recv(*psock,(char*)&newTime,sizeof(SYSTEMTIME),0); str.Format("È⼦ ÏÖÔÚʱ¿Ì: %2dÔÂ%2dÈÕ    %2dʱ%2d·Ö%2dÃë\n\nÁ¬½Ó Æô¶¯Ê±¿Ì: %2dÔÂ%2dÈÕ    %2dʱ%2d·Ö%2dÃë",\
    newTime.wMonth,newTime.wDay,\
    newTime.wHour,newTime.wMinute,\
    newTime.wSecond,\
    oldTime.wMonth,oldTime.wDay,\
    oldTime.wHour,oldTime.wMinute,\
    oldTime.wSecond);
    ::MessageBox(a_hDlg,str,"ʱ¼ä¼Ç¼(µ±µØʱ¼ä)",0);
    }
    if(strcmp(rcv,"RUNTIMES_")==0){}

    //next ÅжÏ
    }
    }
    //À뿪
    //LeaveCriticalSection(&section);
    free(in.data);
    return 1;
    }//上面用到的设置Edit空间的函数//¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö
    void SetEdit(CEdit* pEdit,char *param)
    {  
      int nLen=pEdit->GetWindowTextLength();
      pEdit->SetFocus();   
      pEdit->SetSel(nLen,nLen);   
      pEdit->ReplaceSel(param);   
    }void SetEdit(CEdit* pEdit,CString param)
    {  
    SetEdit(pEdit,param.GetBuffer(1));//µ÷ÓÃÉÏÒ»¸öº¯Êý
    }
      

  2.   

    CListBox还没用过, 一直用CListCtrl建议写个死循环, 频繁插入删除试试