2 candygy candygy 于 2015.06.02 15:31 提问

程序运行一段时间后,界面不刷新 mfc

用vc2008做的程序,在自建的线程里,处理蓝牙虚拟串口通信的接收数据和实时显示!
发现程序跑40分钟左右后,界面变灰!但程序没死,数据通信显示正常。其他控件就没了。移动鼠标可以看到,也可以操作!感觉就是主界面不重绘了!如图:
图片说明
程序运行时看任务管理器的内存,也不大!应该不是内存泄漏的问题
找不出原因了!网上用PeekMessage的方法试了,还是没用!谁能帮忙给个解答!
这个线程机制以前用串口通信和usb虚拟串口通信都是正常的,没出现过这个问题!
线程代码如下:
//接收数据监测线程
UINT CBluetoothScaleDlg::CommThread(LPVOID pParam)
{
//线程函数

CBluetoothScaleDlg pDlg = (CBluetoothScaleDlg)pParam;

//连续稳定计数
pDlg->icount=0;
while(true)
{       
    //start-计算时间
    CTime StartTime,EndTime;
    CTimeSpan ebTime(0,0,0,0);
    StartTime=CTime::GetCurrentTime();

    //com通信
    pDlg->ReadDataAndDisplay();

    //end
    EndTime=CTime::GetCurrentTime();
    ebTime=EndTime-StartTime;          
    if(ebTime.GetSeconds()>3)//无信号判断?
    {
        pDlg->m_ReceiveData="无信号";

        pDlg->SetDlgItemText(IDC_EDIT_ReceivedData_Hex,pDlg->m_ReceiveData);
        //所有指示灯关闭
        //pDlg->m_ctrlIconLight.SetIcon(pDlg->m_hIconNo);                  
     }        

    Sleep(100);
}
return 0;

}

5个回答

oyljerry
oyljerry   Ds   Rxr 2015.06.02 16:11

在对话框OnPaint中添加你的控件重绘等
除了内存泄漏,其次查看一下进程的GDI,是否有泄漏

candygy
candygy 问题解决,gdi有泄漏!
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2015.06.02 16:35

应该线程发消息,让界面UI去更新界面。你应该庆幸你的程序还能运行40分钟,在根本不懂多线程处理编写了完全错误的代码的情况下。

candygy
candygy 但我原来写的串口小程序一直都在用,没出现这个问题!
2 年多之前 回复
VisualEleven
VisualEleven   Ds   Rxr 2015.06.02 16:26

你线程函数中就不要直接操作UI上的控件了,这样不安全,容易崩溃~

candygy
candygy 已经将更新ui控件放到自定义消息中处理了,还是出现这个问题!
2 年多之前 回复
candygy
candygy 回复baiyin:
2 年多之前 回复
candygy
candygy 那怎么更新edit控件?怎么发消息?这个没用过。
2 年多之前 回复
candygy
candygy   2015.06.03 12:14

今天把控件更新显示的部分都放到自定义的消息中了,还是出现这个问题!这个泄漏问题vc2008编译器怎么看呢?
while(true)
{

//start-计算时间
CTime StartTime,EndTime;
CTimeSpan ebTime(0,0,0,0);
StartTime=CTime::GetCurrentTime();

    //com通信
    pDlg->ReadDataAndDisplay();     

    //end
    EndTime=CTime::GetCurrentTime();
    ebTime=EndTime-StartTime;          
    if(ebTime.GetSeconds()>3)//无信号判断?
    {
        pDlg->m_ReceiveData="无信号";                    
     }  
    //6月3日:数据更新到主UI中-向对话框发送自定义消息 
    ::PostMessage(pDlg->m_hWnd, WM_DISPLAY_CHANGE, 0, 0);

    Sleep(100);
}
candygy
candygy   2015.07.02 15:16

GDI对象泄露,问题已解决

Csdn user default icon
上传中...
上传图片
插入图片