1个MFC对话框程序,ADiaLog 类中创建了1个数据发送线程 static UINT SendData();
在ADiaLog  有1个BUTTON ,Click后显示 BDialog,在BDialog中的edit中输东西,奇怪的是一切换
输入法,界面就死了,从来没遇到过这种问题。找了半天也没找到原因,只知道跟SendData线程有关。
不知道是啥原因?有人能解答么?

解决方案 »

  1.   

    请让大家观赏一下你的SendData内脏
      

  2.   

    /*
     * send data thread
     */
    UINT SendData(LPVOID pParam)
    {
    CADlg* pMdlg = (CADlg*)pParam;
    CSocket  sockClient; 
    BOOL  b_Connect         = FALSE ;
    BOOL  b_isSocketCreated = FALSE ; //socket created
    BOOL  b_Sending         = FALSE ; //LOCK
    CString szDescription ;
    BYTE bRec[8];
    int i = 0 ;
    while (1) {
    while(!b_isSocketCreated && i < 3){ //not create socket
    b_isSocketCreated = sockClient.Create();
    i++;
    }
    if(!b_isSocketCreated){ 
    i = 0 ;
    //pMdlg->m_info.AddString(getcurtime() + "Socket not Create,Wait for 10 Sec ...");
    Sleep(10000);
    }
    while(!b_Connect && i < 3){
    b_Connect = sockClient.Connect(pMdlg->psDestIp,PORT);
    i++;
    }
    if(!b_Connect){
    i = 0 ;
    Sleep(10000);
    //pMdlg->m_info.AddString(getcurtime() + "Socket Connect Error  ... ");
    }
    if(b_Connect  && (pMdlg->m_ulSendBufLength != 0)){ // not sending data
    unsigned long ulSendedlength = 0 ;
    if(!b_Sending){
    b_Sending = TRUE ;
    ulSendedlength = sockClient.Send(pMdlg->m_buffer,pMdlg->m_ulSendBufLength);
    if(ulSendedlength == pMdlg->m_ulSendBufLength){
    szDescription.Format("%s%d%s","数据报文发送成功,共发送",pMdlg->m_ulSendBufLength,"字节文件");
    pMdlg->m_info.AddString(getcurtime() + szDescription);
    pMdlg->m_ulSendBufLength = 0 ;
    b_Sending = FALSE ;
    Sleep(3000);
    }
    }
    /*else{
    pMdlg->m_info.AddString(getcurtime() + "数据已发送,等待PacketX反馈数据包..." );
    sockClient.Receive(bRec,8);//阻塞
    if (RECOK == bRec[0] + bRec[1]*256 ){
    szDescription.Format("%s%d%s","数据报文发送成功,共发送",pMdlg->m_ulSendBufLength,"字节文件");
    pMdlg->m_info.AddString(getcurtime() + szDescription);
    pMdlg->m_ulSendBufLength = 0 ;
    b_Sending = FALSE ;
    }
    Sleep(5000);
    }*/
    }
    Sleep(10000);
    }
    sockClient.Close();
    b_isSocketCreated = FALSE ;
    b_Connect         = FALSE ;
    return    0 ;
      

  3.   

    看这个样子,你是直接操作界面了
    你改成用消息来搞
    譬如
    pMdlg->m_info.AddString(getcurtime() + szDescription); 改为通过向pMdlg所指的对话框post一个消息,并将getcurtime() + szDescription作为参数然后由那个消息响应函数来执行m_info.AddString操作
      

  4.   

    注释掉CADlg* pMdlg = (CADlg*)pParam; 不获取主窗口指针 ,好, 我去试试。