MFC 界面卡死到底为何

现象:程序运行一段时间后,界面卡死

程序开启了一个监听线程:
    //创建接收信号线程
    Thread = AfxBeginThread(GetIOMsgThread,
        this,
        THREAD_PRIORITY_NORMAL,
        0,
        0,
        NULL);
        
int CFEECARD_MULTIDlg::MainGetIOMsg(LPVOID lpParam)
{
    int ret = -1;

    UCHAR            ucBuff[1024];
    DWORD            dwReadLength;
    int nE = 0;
    int nD = 0;
    int nB = 0;
    int n7 = 0;

    while(!stopFlag2)
    {

        if (m_bIsConnectedIOComm == TRUE)
        {

            unsigned char IOBuff[256]={0};

            int nRecv= 0;

            Sleep(50);
            memset(IOBuff,0,256);
            nRecv = ReadComm(IOBuff, 256,hComm_IO);
            if (nRecv)
            {
                for(int i = 0;i<nRecv;i++)
                {
                    if ((IOBuff[i]==0x0E) && (DownloadParam[0].GoFlag == FALSE))//第一个socket
                    {
                        nE++;
                        if (nE > 10)
                        {
                            nE = 0;
                            DownloadParam[0].GoFlag = TRUE;

                            ResumeThread(DownloadParam[0].hThread);
                        }
                    }
                    else if ((IOBuff[i] == 0x0D) && (DownloadParam[1].GoFlag == FALSE))//第二个socket
                    {

                        nD++;
                        if (nD > 10)
                        {
                            nD = 0;
                            DownloadParam[1].GoFlag = TRUE;
                            ResumeThread(DownloadParam[1].hThread);
                        }
                    }
                    else if ((IOBuff[i] == 0x0B)  && (DownloadParam[2].GoFlag == FALSE))//第三个socket
                    {

                        nB++;
                        if (nB > 10)
                        {
                            nB = 0;
                            DownloadParam[2].GoFlag = TRUE;
                            ResumeThread(DownloadParam[2].hThread);
                        }
                    }
                    else if ((IOBuff[i] == 0x07)  && (DownloadParam[3].GoFlag == FALSE))//第四个socket
                    {

                        n7++;
                        if (n7 > 10)
                        {
                            n7 = 0;
                            DownloadParam[3].GoFlag = TRUE;
                            ResumeThread(DownloadParam[3].hThread);
                        }
                    }

                }

            }

        }


    }


    return 0;
}

另外又创建了四个下载线程:

DownloadParam[i].hThread = (AfxBeginThread(DownCosThread, &(DownloadParam[i]),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL))->m_hThread;

创建不运行,当监听线程接收到信号时,唤醒下载线程:

int CFEECARD_MULTIDlg::DownLoadCosProc(LPVOID lpParam)
{
    P_DL_COS_STR pDownloadParam = (P_DL_COS_STR)lpParam;
    CString str;


    //图片显示初始化
    sd_init(pDownloadParam->pPics);

    pDownloadParam->pPrgs->SetPos(0);
    pDownloadParam->pPrgs->SetWindowText("");
    pDownloadParam->pPrgs->SetShowText(false);
    str.Format("%d-- 未连接设备",pDownloadParam->threadID);
    pDownloadParam->pNotes->SetWindowText(str);
    pDownloadParam->pResults->SetWindowText("等待开始信号...");


    while(!stopFlag)
    {
    
        Sleep(2000);
        //if(pDownloadParam->GoFlag)
        {
            //图片显示初始化
            sd_init(pDownloadParam->pPics);

            pDownloadParam->pPrgs->SetPos(0);
            pDownloadParam->pPrgs->SetWindowText("");    
            pDownloadParam->pPrgs->SetShowText(false);
            pDownloadParam->pResults->SetWindowText("");    

            str.Format("%d --",pDownloadParam->threadID);
            pDownloadParam->pNotes->SetWindowText(str+" 未连接设备");

            

            if (DownLoadCosBin(lpParam))
            {        
            
                ShowDownLoadNum(1);
                sd_error(pDownloadParam->pPics);
                GoFail(pDownloadParam->threadID);

                pDownloadParam->pPCSCReaderName="";
                str.Format("%d-- 未连接设备",pDownloadParam->threadID);
                pDownloadParam->pNotes->SetWindowText(str);

            }
            else
            {        
                pDownloadParam->pPCSCReaderName="";
                str.Format("%d-- 未连接设备",pDownloadParam->threadID);
                pDownloadParam->pNotes->SetWindowText(str);

                if (SetCos(lpParam))
                {
                    ShowDownLoadNum(1);
                    sd_error(pDownloadParam->pPics);
                    GoFail(pDownloadParam->threadID);
                }
                else
                {
                    
                    Show_Process_Map("下载COS完成",100,lpParam);
                    pDownloadParam->pResults->SetWindowText("下载COS完成");

                    ShowDownLoadNum(0);
                    sd_success(pDownloadParam->pPics);
                    GoPass(pDownloadParam->threadID);
                }

                if (pDownloadParam->hComm != NULL)
                {
                    m_cardReaderUartT1.SMCardClosePort(pDownloadParam->hComm);
                    pDownloadParam->hComm = NULL;    
                }

            }
            
            

            
                
            pDownloadParam->GoFlag = FALSE;
            SuspendThread(pDownloadParam->hThread);

        }

    }

    return 0;
}

为何运行一段时间后,界面会出现卡死现象?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值