MFC 程序一定时间内自动卡死变白后重启,该如何解决

MFC 程序一定时间内自动卡死变白后重启
本帖最后由 VisualEleven 于 2014-05-09 18:28:31 编辑
我做的是一个光谱仪的显示界面,为了防止界面闪烁,使用了双缓存技术。因为每隔固定时间(例如10ms要求数据刷新),所以主要程序是在定时器中完成的,主要就是使用了位图CBitmap,创建与显示的编辑框相兼容的Dc,并在位图中绘图,绘图完成后将位图显示在编辑框中。定时器的函数如下;

 

void CMy427eveningDlg::OnTimer(UINT_PTR nIDEvent)
{
    //******************************************************************************//
    if(true==m_Isthefirsttime)//第一次执行计数器的时候将data中添加MAXPOINT个数,防止后面访问data时溢出
    {
        for(int i=0;i<MAXPOINT;++i)
        {
         data.push_back(f_cos(m_Count+data.size()));  //f_cos()是要绘制的函数曲线
        }
        m_Isthefirsttime=false;     //data是一个deque<float>的数组,存储将被显示的数据点坐标y轴
    }
 
 
    if (true==m_stoportiming)
 
    {
       if (m_Xnunbers==m_NewXnum)//默认m_NewXnum等于100
      {
        data.pop_front();
        ++m_Count;   
        data.push_back(f_cos(m_Count+data.size()));
      }
    else if(m_NewXnum > m_Xnunbers)
      {
        for (int i=0;i<m_NewXnum-m_Xnunbers;++i)
         data.push_back(f_cos(m_Count+data.size()));    
      }
    else if (m_NewXnum<m_Xnunbers)
    {
        for (int i=0;i<m_Xnunbers-m_NewXnum;++i)
        {    data.pop_front();
            ++m_Count;
        }
    }
    }
 
 
    m_Xnunbers=m_NewXnum;
   //********************************************************************************//以上程序段主要实现显示界面的横轴分辨率可调
//**********************************************************************************m_NewXnum是整个界面这一次会绘制的点数///**********************************************************************************m_Xnunbers是整个界面上一次会绘制的点数
    if(1== nIDEvent )   ////////定时器的标志为1
    {
 
 
     CRect rc;
     CClientDC *pDC=(CClientDC *)GetDlgItem(IDC_drawplace)->GetDC(); //获取绘图框的设备上下文dc
      GetDlgItem(IDC_drawplace)-> GetClientRect(rc); //获取绘图框的大小
      CRect m_rec(rc);
     
 
      ////////双缓冲技术中的两个重要变量
      CDC pMemDC;   //在内存画图的DC和存在内存中的位图
      pMemDC.CreateCompatibleDC(pDC);
      CBitmap membitmap;
      membitmap.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());  //将此Dc和内存中的位图相关联
        pMemDC.SelectObject(&membitmap); 
   
   //  CBrush *pbrush=pDC->GetCurrentBrush(); //将位图的背景设为白色
        CBrush pbrush(RGB(0,100,100));
        pMemDC.FillRect(rc,&pbrush);  //改变位图背景颜色,如果不变的话显示的背景将为黑色,极其难看
 
////////////************************************************
      rc.DeflateRect(rc.Width()/20,rc.Height()/20); //矩形内缩函数
   int gridXnums=20,gridYnums=5;
    int dx=rc.Width()/gridXnums;
   int dy=rc.Height()/gridYnums;
   CPen gridPen(0,0,RGB(0,0,0)); 
  //////////////////////////////////////绘制网格线
   //所有一切跟绘图有关的句柄,在内存位图中实施进行的都应该是用pMemDC来完成,而不是使用编辑框的pDC
  CRect gridRect(rc.left,rc.top,rc.left+dx*gridXnums,rc.top+dy*gridYnums);  
 CPen *oldPen=pDC->SelectObject(&gridPen);
 for(int i=0;i<=gridXnums;i++) //画网格线条X轴
 {
 pMemDC.MoveTo(gridRect.left+i*dx,gridRect.bottom);
pMemDC.LineTo(gridRect.left+i*dx,gridRect.top);
 }
 for(int i=0;i<=gridYnums;i++)  //画网格线条Y轴
 {
 pMemDC.MoveTo(gridRect.left,gridRect.top+i*dy);
 pMemDC.LineTo(gridRect.right,gridRect.top+i*dy);
 }
 pMemDC.SelectObject(oldPen);
 gridPen.Detach();
 
 
 gridPen.CreatePen(PS_SOLID,3,RGB(255,255,255));
  pMemDC.SelectObject(&gridPen);
 ////////////////////////////////////////////
   //绘制坐标轴和刻度线
   // 绘制坐标轴
pMemDC.MoveTo(gridRect.left,gridRect.top-20);
 
 // 垂直轴
pMemDC.LineTo(gridRect.left,gridRect.bottom);