+ -
当前位置:首页 → 问答吧 → MFC子线程调用绘图函数程序会挂

MFC子线程调用绘图函数程序会挂

时间:2011-11-28

来源:互联网

高手们好,我在子线程中调用绘图函数,多次重复调用程序就会崩溃,请问是怎么回事?

for循环大概调用实际次就会挂,挂在SelectObject原函数中 ASSERT(m_hDC != NULL);

请问改怎么解决?谢谢了.C++不太熟.

C/C++ code

UINT ThreadExecuteTest(LPVOID lpParam)
{
       ...

      while(is_loop_run_flag)
     {
     pdlg->ClearAntRect();
     pdlg->DispAllAnt();
     Sleep(100);
     pdlg->UpdateAntValue();
     if(pdlg->IsAllAntGotoEnd())
     {
        pdlg->SetAntInitValue();
        pdlg->updatetime(run_time);
            run_time=0;
            is_loop_run_flag=false;
     }
      run_time++;
                                                            
     }
   ...
}


void CCreepingGameDlg::ClearAntRect()
{
    int x1,y1,x2,y2;
    CDC *p1=GetDC();
    CPen pen1;
    CPen *oldPen;
    
    y1=TREE_START_Y-20;
    y2=TREE_START_Y-2;
    pen1.CreatePen(PS_SOLID,2,RGB(255,255,255));
    oldPen = p1->SelectObject(&pen1);

    x1=TREE_START_X;
    x2=TREE_END_X+10;
    p1->MoveTo(x1,y1);
    p1->Rectangle(x1,y1,x2,y2);
    p1->SelectObject(oldPen);

}


void CCreepingGameDlg::DispAnt(int start_x,COLORREF color)
{
    int x1,y1,x2,y2;
    CDC *p1=GetDC();
    CPen pen1;
    CPen *oldPen;
    
    y1=TREE_START_Y-20;
    y2=TREE_START_Y-2;    
    pen1.CreatePen(PS_SOLID,2,color);
    oldPen = p1->SelectObject(&pen1);

    x1=start_x;
    x2=x1+10;
    p1->MoveTo(x1,y1);
//    p1->Rectangle(x1,y1,x2,y2);
    p1->SelectObject(oldPen);
}



作者: muyeyueming   发布时间: 2011-11-28

网上搜索,有人说改用发消息绘图,我试验了下,下面的代码不行,还是现象一样,盼望高手解答!!
C/C++ code

UINT ThreadExecuteTest(LPVOID lpParam)
{
  ...
  while(is_loop_run_flag)
  {
   ::SendMessage(pdlg->m_hWnd,WM_UPDATE_WIN,0,0);
...
}

LRESULT CCreepingGameDlg::antarea_redraw(WPARAM w,LPARAM l)
{
    ClearAntRect();
    DispAllAnt();
    return 0;
}


作者: muyeyueming   发布时间: 2011-11-28

CDC *p1=GetDC();
需要ReleaseDC(p1)

作者: heksn   发布时间: 2011-11-28