MFC 程序运行一段时间就没有画面,卡死了 求MFC大神帮忙~~

时间:2021-01-30 15:26:20
实现的是一个交通模拟,想尽量做的简单一点就好,程序主要用的东西有:
1.CList 用于存储每条路上的车辆,便于进行控制
2.路灯画在OnCreate 中,在ontimer 中进行控制
3.有专门的函数画车和画路,在ontimer 函数中调用
4.有几个函数实现车辆对路灯的判断和过马路以及控制车距功能(只有直行,拐弯还没做,传递指针为参数)
刚开始做的时候还没发现,等做完所有车辆直行后,发现运行一段时间后画面就白了,没反应了。
在网上搜了很多,有说指针问题的,可是我的指针用的很少的,只有过马路功能用的指针为参数,其他基本没用到指针。 求MFC 大神指教一下~~~~~ MFC 程序运行一段时间就没有画面,卡死了 求MFC大神帮忙~~

13 个解决方案

#1


也许是绘制的效率问题,资源问题。OnTimer定时多长时间执行一次?你有没有测试过你的代码性能

#2


仔细检查代码,估计存在资源泄漏

#3


引用 1 楼 happyparrot 的回复:
也许是绘制的效率问题,资源问题。OnTimer定时多长时间执行一次?你有没有测试过你的代码性能


正常情况下1000ms 刷新一次就好了, 但是测试的时候不想等那么久, 就调成了500ms,刚刚试了下1000ms,也是一样的结果。我其实也是刚学MFC 还不知道怎么测试代码的性能,很多东西都是摸索着写的。资源的话我就用了一个位图,表示车辆,然后画车的函数就用这个位图重复创建显示车辆。

#4


引用 2 楼 worldy 的回复:
仔细检查代码,估计存在资源泄漏


额,我才刚学MFC, 还不知道资源漏洞是怎么造成的,请问一下,资源漏洞一般会出现在哪些操作中呢?

#5


资源包括内存没有释放,gdi对象没有释放等等

#6


引用 5 楼 worldy 的回复:
资源包括内存没有释放,gdi对象没有释放等等

我刚刚找了找 我在oncreate 中写了这些画交通灯的代码,不知道是不是这的问题,您帮我看看?
int CTrafficView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
CEdit* pEdit1 = new CEdit;
pEdit1->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(130, 180, 150, 200), this, 3);
SetDlgItemText(3, "绿");


CEdit* pEdit2 = new CEdit;
pEdit2->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(830, 180, 850, 200), this, 7);
SetDlgItemText(7, "绿");

CEdit* pEdit3 = new CEdit;
pEdit3->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(150, 80, 170, 100), this, 1);
SetDlgItemText(1, "绿");


CEdit* pEdit4 = new CEdit;
pEdit4->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(850, 80, 870, 100), this, 5);
SetDlgItemText(5, "绿");


CEdit* pEdit5 = new CEdit;
pEdit5->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(230, 200, 250, 220), this, 4);
SetDlgItemText(4, "绿");


CEdit* pEdit6 = new CEdit;
pEdit6->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(930, 200, 950, 220), this, 8);
SetDlgItemText(8, "绿");


CEdit* pEdit7 = new CEdit;
pEdit7->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(950, 100, 970, 120), this, 6);
SetDlgItemText(6, "绿");

CEdit* pEdit8 = new CEdit;
pEdit8->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(250, 100, 270, 120), this, 2);



SetTimer(1,500,NULL);

// SetTimer(2,1000,NULL);


return 0;
}

#7


OnCreate都是一次性的代码,不会重复申请。
你的OnTimer代码才是主要的,需要看一下是否有问题

#8


引用 7 楼 happyparrot 的回复:
OnCreate都是一次性的代码,不会重复申请。
你的OnTimer代码才是主要的,需要看一下是否有问题

++

OnCreate即使泄漏也不会影响大局

#9


引用 7 楼 happyparrot 的回复:
OnCreate都是一次性的代码,不会重复申请。
你的OnTimer代码才是主要的,需要看一下是否有问题

我刚刚找了下ontimer ,把所有准备注销的车辆对象都加上了析构操作,但是还是没解决额,不知道有没有其他的地方没找到,还希望您能帮忙看看啊。这里面很多重复的操作,等功能实现完了还要再抽象一下,先麻烦您啦~

void CTrafficView::OnTimer(UINT nIDEvent) 
{
count++;
// TODO: Add your message handler code here and/or call default
if(count%14==0)
{
SetDlgItemText(2, "绿");
SetDlgItemText(3, "绿");
SetDlgItemText(6, "绿");
SetDlgItemText(7, "绿");
SetDlgItemText(1, "红");
SetDlgItemText(5, "红");
SetDlgItemText(4, "红");
SetDlgItemText(8, "红");
}
if(count%14==12)
{
SetDlgItemText(2, "红");
SetDlgItemText(3, "红");
SetDlgItemText(7, "红");
SetDlgItemText(6, "红");
SetDlgItemText(1, "绿");
SetDlgItemText(5, "绿");
SetDlgItemText(4, "绿");
SetDlgItemText(8, "绿");
}


/**************1号路*************************/

if(count%3==0) //每3秒产生一辆车
{
if(road1.GetCount()<rn1) //如果这条路上车还没满 添加一辆车
{
CCar car(0,175,5,false);
road1.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcr(3,&road1,130); //用于控制road1 中的车辆驶过路口
/**************6号路*************************/

if(count%3==0) //每3秒产生一辆车
{
if(road6.GetCount()<rn1) //如果这条路上车还没满 添加一辆车
{
CCar car(1080,102,2,false);
road6.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrXm(6,&road6,950);

/********************2号路*******************************/
if((!road4.IsEmpty())&&(road4.GetHead().x<=150))
{
road4.GetHead().~CCar();
road4.RemoveHead(); //1号路最前端车辆驶出1号路,从list中除去
CCar car(150,102,2,false);
road2.AddTail(car);
}


POSITION pos2 = road2.GetHeadPosition();
for(;pos2!=NULL;road2.GetNext(pos2))
{
road2.GetAt(pos2).x-=10;
}


if((!road2.IsEmpty())&&(road2.GetHead().x<=0))
{
road2.GetHead().~CCar();
road2.RemoveHead(); //2号路最前端车辆驶出2号路,从list中除去
}




/********************3号路*******************************/
if(road1.GetHead().x>=230)
{
road1.GetHead().~CCar();
road1.RemoveHead(); //3号路最前端车辆驶出3号路,从list中除去
CCar car(230,175,5,false);
road3.AddTail(car);

}
checkAcr(7,&road3,830);

/********************4号路*******************************/
if(road6.GetHead().x<850)
{
road6.GetHead().~CCar();
road6.RemoveHead(); //4号路最前端车辆驶出4号路,从list中除去
CCar car(850,102,2,false);
road4.AddTail(car);

}
checkAcrXm(2,&road4,250);

/********************5号路*******************************/
if((!road3.IsEmpty())&&(road3.GetHead().x>=930))
{
road3.GetHead().~CCar();
road3.RemoveHead(); //5号路最前端车辆驶出5号路,从list中除去
CCar car(930,175,5,false);
road5.AddTail(car);
}


POSITION pos5 = road5.GetHeadPosition();
for(;pos5!=NULL;road5.GetNext(pos5))
{
road5.GetAt(pos5).x+=10;
}


if((!road5.IsEmpty())&&(road5.GetHead().x>=1080))
{
road5.GetHead().~CCar();
road5.RemoveHead(); //6号路最前端车辆驶出6号路,从list中除去
}




/********************7号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road7.GetCount()<rn7) //如果这条路上车还没满 添加一辆车
{
CCar car(152,0,9,false);
road7.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYp(1,&road7,80);
/********************8号路*******************************/
if((!road10.IsEmpty())&&(road10.GetHead().y<=100))
{
road10.GetHead().~CCar();
road10.RemoveHead(); //7号路最前端车辆驶出7号路,从list中除去
CCar car(228,100,8,false);
road8.AddTail(car);
}

POSITION pos8 = road8.GetHeadPosition();
for(;pos8!=NULL;road8.GetNext(pos8))
{
road8.GetAt(pos8).y-=20;
}

if((!road8.IsEmpty())&&(road8.GetHead().y<=0))
{
road8.GetHead().~CCar();
road8.RemoveHead(); //8号路最前端车辆驶出8号路,从list中除去
}

/********************9号路*******************************/

if((!road7.IsEmpty())&&(road7.GetHead().y>180))
{
road7.GetHead().~CCar();
road7.RemoveHead(); //7号路最前端车辆驶出7号路,从list中除去
CCar car(152,180,9,false);
road9.AddTail(car);
}

POSITION pos9 = road9.GetHeadPosition();
for(;pos9!=NULL;road9.GetNext(pos9))
{
road9.GetAt(pos9).y+=20;
}
if((!road9.IsEmpty())&&(road9.GetHead().y>=600))
{
road9.GetHead().~CCar();
road9.RemoveHead(); //9号路最前端车辆驶出9号路,从list中除去
}

/********************10号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road10.GetCount()<rn10) //如果这条路上车还没满 添加一辆车
{
CCar car(228,600,8,false);
road10.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYm(4,&road10,200);

/********************11号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road11.GetCount()<rn7) //如果这条路上车还没满 添加一辆车
{
CCar car(852,0,13,false);
road11.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYp(5,&road11,80);
/********************12号路*******************************/
if((!road14.IsEmpty())&&(road14.GetHead().y<=100))
{
road14.GetHead().~CCar();
road14.RemoveHead(); //11号路最前端车辆驶出7号路,从list中除去
CCar car(928,100,12,false);
road12.AddTail(car);
}

POSITION pos12 = road12.GetHeadPosition();
for(;pos12!=NULL;road12.GetNext(pos12))
{
road12.GetAt(pos12).y-=20;
}

if((!road12.IsEmpty())&&(road12.GetHead().y<=0))
{
road12.GetHead().~CCar();
road12.RemoveHead(); //1号路最前端车辆驶出1号路,从list中除去
}

/********************13号路*******************************/
if((!road11.IsEmpty())&&(road11.GetHead().y>180))
{
road11.GetHead().~CCar();
road11.RemoveHead(); //11号路最前端车辆驶出11号路,从list中除去
CCar car(852,180,13,false);
road13.AddTail(car);
}

POSITION pos13 = road13.GetHeadPosition();
for(;pos13!=NULL;road13.GetNext(pos13))
{
road13.GetAt(pos13).y+=20;
}

if((!road13.IsEmpty())&&(road13.GetHead().y>=600))
{
road13.GetHead().~CCar();
road13.RemoveHead(); //13号路最前端车辆驶出13号路,从list中除去
}
/********************14号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road14.GetCount()<rn10) //如果这条路上车还没满 添加一辆车
{
CCar car(928,600,12,false);
road14.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYm(8,&road14,200);

    Invalidate();

CView::OnTimer(nIDEvent);
}

#10


OnDraw中干了什么呢?
OnTimer中都是汽车的增减,没有使用new申请空间,似乎没什么问题

#11


引用 10 楼 happyparrot 的回复:
OnDraw中干了什么呢?
OnTimer中都是汽车的增减,没有使用new申请空间,似乎没什么问题


我ondraw中什么都没做  都放到onpaint 中了。。。在onpaint 中调用画车的函数把所有路上的车画了出来,别的也没干什么。 我怀疑我是不是问题出在画车的函数中呢,我好想只有选中,没有删除哎 ,因为画车 的函数是单独放在一个方法里,在onpaint 中调用,没有CDC 句柄,就在网上找了下面这种实现方式, 不知道是不是产生问题的地方啊。才学1个星期多一点 ,最近在赶这个课程设计,很多东西都是模模糊糊的,还望指点一下啊。
void CTrafficView::drawCar(int x, int y)
{
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);

HDC MemDC;
CBitmap bit;
MemDC =CreateCompatibleDC(0);
bit.LoadBitmap(IDB_BITMAP1);
SelectObject(MemDC,bit);
CClientDC dc(this);
BitBlt(dc.m_hDC,x,y,bmpInfo.bmWidth,bmpInfo.bmHeight,MemDC,0,0,SRCCOPY);


// MemDC.SelectObject(pOldBitmap);  
// MemDC.DeleteDC();                                      //删除DC   
// bmpInfo.DeleteObject();            

}

#12


你这里需要把bmp,bit,MemDC,dc都释放掉。

#13


引用 12 楼 happyparrot 的回复:
你这里需要把bmp,bit,MemDC,dc都释放掉。

果然是drawcar 函数的问题,终于解决了,感谢你们!
代码贴出来和大家分享一下~ MFC 程序运行一段时间就没有画面,卡死了 求MFC大神帮忙~~
void CTrafficView::drawCar(int x, int y)
{
// load IDB_BITMAP1 from our resources
   CDC *pDC;
   pDC=GetDC();


   CBitmap bmp;
   if (bmp.LoadBitmap(IDB_BITMAP1))
   {
      BITMAP bmpInfo;
      bmp.GetBitmap(&bmpInfo);

      CDC dcMemory;
      dcMemory.CreateCompatibleDC(pDC);
      CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);

      CRect rect;
      GetClientRect(&rect);

      pDC->BitBlt(x, y, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 
         0, 0, SRCCOPY);

      dcMemory.SelectObject(pOldBitmap);
   }
   else
      TRACE0("ERROR: Where's IDB_BITMAP1?\n");

    ReleaseDC(pDC);
  }

#1


也许是绘制的效率问题,资源问题。OnTimer定时多长时间执行一次?你有没有测试过你的代码性能

#2


仔细检查代码,估计存在资源泄漏

#3


引用 1 楼 happyparrot 的回复:
也许是绘制的效率问题,资源问题。OnTimer定时多长时间执行一次?你有没有测试过你的代码性能


正常情况下1000ms 刷新一次就好了, 但是测试的时候不想等那么久, 就调成了500ms,刚刚试了下1000ms,也是一样的结果。我其实也是刚学MFC 还不知道怎么测试代码的性能,很多东西都是摸索着写的。资源的话我就用了一个位图,表示车辆,然后画车的函数就用这个位图重复创建显示车辆。

#4


引用 2 楼 worldy 的回复:
仔细检查代码,估计存在资源泄漏


额,我才刚学MFC, 还不知道资源漏洞是怎么造成的,请问一下,资源漏洞一般会出现在哪些操作中呢?

#5


资源包括内存没有释放,gdi对象没有释放等等

#6


引用 5 楼 worldy 的回复:
资源包括内存没有释放,gdi对象没有释放等等

我刚刚找了找 我在oncreate 中写了这些画交通灯的代码,不知道是不是这的问题,您帮我看看?
int CTrafficView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
CEdit* pEdit1 = new CEdit;
pEdit1->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(130, 180, 150, 200), this, 3);
SetDlgItemText(3, "绿");


CEdit* pEdit2 = new CEdit;
pEdit2->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(830, 180, 850, 200), this, 7);
SetDlgItemText(7, "绿");

CEdit* pEdit3 = new CEdit;
pEdit3->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(150, 80, 170, 100), this, 1);
SetDlgItemText(1, "绿");


CEdit* pEdit4 = new CEdit;
pEdit4->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(850, 80, 870, 100), this, 5);
SetDlgItemText(5, "绿");


CEdit* pEdit5 = new CEdit;
pEdit5->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(230, 200, 250, 220), this, 4);
SetDlgItemText(4, "绿");


CEdit* pEdit6 = new CEdit;
pEdit6->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(930, 200, 950, 220), this, 8);
SetDlgItemText(8, "绿");


CEdit* pEdit7 = new CEdit;
pEdit7->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(950, 100, 970, 120), this, 6);
SetDlgItemText(6, "绿");

CEdit* pEdit8 = new CEdit;
pEdit8->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
    CRect(250, 100, 270, 120), this, 2);



SetTimer(1,500,NULL);

// SetTimer(2,1000,NULL);


return 0;
}

#7


OnCreate都是一次性的代码,不会重复申请。
你的OnTimer代码才是主要的,需要看一下是否有问题

#8


引用 7 楼 happyparrot 的回复:
OnCreate都是一次性的代码,不会重复申请。
你的OnTimer代码才是主要的,需要看一下是否有问题

++

OnCreate即使泄漏也不会影响大局

#9


引用 7 楼 happyparrot 的回复:
OnCreate都是一次性的代码,不会重复申请。
你的OnTimer代码才是主要的,需要看一下是否有问题

我刚刚找了下ontimer ,把所有准备注销的车辆对象都加上了析构操作,但是还是没解决额,不知道有没有其他的地方没找到,还希望您能帮忙看看啊。这里面很多重复的操作,等功能实现完了还要再抽象一下,先麻烦您啦~

void CTrafficView::OnTimer(UINT nIDEvent) 
{
count++;
// TODO: Add your message handler code here and/or call default
if(count%14==0)
{
SetDlgItemText(2, "绿");
SetDlgItemText(3, "绿");
SetDlgItemText(6, "绿");
SetDlgItemText(7, "绿");
SetDlgItemText(1, "红");
SetDlgItemText(5, "红");
SetDlgItemText(4, "红");
SetDlgItemText(8, "红");
}
if(count%14==12)
{
SetDlgItemText(2, "红");
SetDlgItemText(3, "红");
SetDlgItemText(7, "红");
SetDlgItemText(6, "红");
SetDlgItemText(1, "绿");
SetDlgItemText(5, "绿");
SetDlgItemText(4, "绿");
SetDlgItemText(8, "绿");
}


/**************1号路*************************/

if(count%3==0) //每3秒产生一辆车
{
if(road1.GetCount()<rn1) //如果这条路上车还没满 添加一辆车
{
CCar car(0,175,5,false);
road1.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcr(3,&road1,130); //用于控制road1 中的车辆驶过路口
/**************6号路*************************/

if(count%3==0) //每3秒产生一辆车
{
if(road6.GetCount()<rn1) //如果这条路上车还没满 添加一辆车
{
CCar car(1080,102,2,false);
road6.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrXm(6,&road6,950);

/********************2号路*******************************/
if((!road4.IsEmpty())&&(road4.GetHead().x<=150))
{
road4.GetHead().~CCar();
road4.RemoveHead(); //1号路最前端车辆驶出1号路,从list中除去
CCar car(150,102,2,false);
road2.AddTail(car);
}


POSITION pos2 = road2.GetHeadPosition();
for(;pos2!=NULL;road2.GetNext(pos2))
{
road2.GetAt(pos2).x-=10;
}


if((!road2.IsEmpty())&&(road2.GetHead().x<=0))
{
road2.GetHead().~CCar();
road2.RemoveHead(); //2号路最前端车辆驶出2号路,从list中除去
}




/********************3号路*******************************/
if(road1.GetHead().x>=230)
{
road1.GetHead().~CCar();
road1.RemoveHead(); //3号路最前端车辆驶出3号路,从list中除去
CCar car(230,175,5,false);
road3.AddTail(car);

}
checkAcr(7,&road3,830);

/********************4号路*******************************/
if(road6.GetHead().x<850)
{
road6.GetHead().~CCar();
road6.RemoveHead(); //4号路最前端车辆驶出4号路,从list中除去
CCar car(850,102,2,false);
road4.AddTail(car);

}
checkAcrXm(2,&road4,250);

/********************5号路*******************************/
if((!road3.IsEmpty())&&(road3.GetHead().x>=930))
{
road3.GetHead().~CCar();
road3.RemoveHead(); //5号路最前端车辆驶出5号路,从list中除去
CCar car(930,175,5,false);
road5.AddTail(car);
}


POSITION pos5 = road5.GetHeadPosition();
for(;pos5!=NULL;road5.GetNext(pos5))
{
road5.GetAt(pos5).x+=10;
}


if((!road5.IsEmpty())&&(road5.GetHead().x>=1080))
{
road5.GetHead().~CCar();
road5.RemoveHead(); //6号路最前端车辆驶出6号路,从list中除去
}




/********************7号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road7.GetCount()<rn7) //如果这条路上车还没满 添加一辆车
{
CCar car(152,0,9,false);
road7.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYp(1,&road7,80);
/********************8号路*******************************/
if((!road10.IsEmpty())&&(road10.GetHead().y<=100))
{
road10.GetHead().~CCar();
road10.RemoveHead(); //7号路最前端车辆驶出7号路,从list中除去
CCar car(228,100,8,false);
road8.AddTail(car);
}

POSITION pos8 = road8.GetHeadPosition();
for(;pos8!=NULL;road8.GetNext(pos8))
{
road8.GetAt(pos8).y-=20;
}

if((!road8.IsEmpty())&&(road8.GetHead().y<=0))
{
road8.GetHead().~CCar();
road8.RemoveHead(); //8号路最前端车辆驶出8号路,从list中除去
}

/********************9号路*******************************/

if((!road7.IsEmpty())&&(road7.GetHead().y>180))
{
road7.GetHead().~CCar();
road7.RemoveHead(); //7号路最前端车辆驶出7号路,从list中除去
CCar car(152,180,9,false);
road9.AddTail(car);
}

POSITION pos9 = road9.GetHeadPosition();
for(;pos9!=NULL;road9.GetNext(pos9))
{
road9.GetAt(pos9).y+=20;
}
if((!road9.IsEmpty())&&(road9.GetHead().y>=600))
{
road9.GetHead().~CCar();
road9.RemoveHead(); //9号路最前端车辆驶出9号路,从list中除去
}

/********************10号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road10.GetCount()<rn10) //如果这条路上车还没满 添加一辆车
{
CCar car(228,600,8,false);
road10.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYm(4,&road10,200);

/********************11号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road11.GetCount()<rn7) //如果这条路上车还没满 添加一辆车
{
CCar car(852,0,13,false);
road11.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYp(5,&road11,80);
/********************12号路*******************************/
if((!road14.IsEmpty())&&(road14.GetHead().y<=100))
{
road14.GetHead().~CCar();
road14.RemoveHead(); //11号路最前端车辆驶出7号路,从list中除去
CCar car(928,100,12,false);
road12.AddTail(car);
}

POSITION pos12 = road12.GetHeadPosition();
for(;pos12!=NULL;road12.GetNext(pos12))
{
road12.GetAt(pos12).y-=20;
}

if((!road12.IsEmpty())&&(road12.GetHead().y<=0))
{
road12.GetHead().~CCar();
road12.RemoveHead(); //1号路最前端车辆驶出1号路,从list中除去
}

/********************13号路*******************************/
if((!road11.IsEmpty())&&(road11.GetHead().y>180))
{
road11.GetHead().~CCar();
road11.RemoveHead(); //11号路最前端车辆驶出11号路,从list中除去
CCar car(852,180,13,false);
road13.AddTail(car);
}

POSITION pos13 = road13.GetHeadPosition();
for(;pos13!=NULL;road13.GetNext(pos13))
{
road13.GetAt(pos13).y+=20;
}

if((!road13.IsEmpty())&&(road13.GetHead().y>=600))
{
road13.GetHead().~CCar();
road13.RemoveHead(); //13号路最前端车辆驶出13号路,从list中除去
}
/********************14号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road14.GetCount()<rn10) //如果这条路上车还没满 添加一辆车
{
CCar car(928,600,12,false);
road14.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYm(8,&road14,200);

    Invalidate();

CView::OnTimer(nIDEvent);
}

#10


OnDraw中干了什么呢?
OnTimer中都是汽车的增减,没有使用new申请空间,似乎没什么问题

#11


引用 10 楼 happyparrot 的回复:
OnDraw中干了什么呢?
OnTimer中都是汽车的增减,没有使用new申请空间,似乎没什么问题


我ondraw中什么都没做  都放到onpaint 中了。。。在onpaint 中调用画车的函数把所有路上的车画了出来,别的也没干什么。 我怀疑我是不是问题出在画车的函数中呢,我好想只有选中,没有删除哎 ,因为画车 的函数是单独放在一个方法里,在onpaint 中调用,没有CDC 句柄,就在网上找了下面这种实现方式, 不知道是不是产生问题的地方啊。才学1个星期多一点 ,最近在赶这个课程设计,很多东西都是模模糊糊的,还望指点一下啊。
void CTrafficView::drawCar(int x, int y)
{
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);

HDC MemDC;
CBitmap bit;
MemDC =CreateCompatibleDC(0);
bit.LoadBitmap(IDB_BITMAP1);
SelectObject(MemDC,bit);
CClientDC dc(this);
BitBlt(dc.m_hDC,x,y,bmpInfo.bmWidth,bmpInfo.bmHeight,MemDC,0,0,SRCCOPY);


// MemDC.SelectObject(pOldBitmap);  
// MemDC.DeleteDC();                                      //删除DC   
// bmpInfo.DeleteObject();            

}

#12


你这里需要把bmp,bit,MemDC,dc都释放掉。

#13


引用 12 楼 happyparrot 的回复:
你这里需要把bmp,bit,MemDC,dc都释放掉。

果然是drawcar 函数的问题,终于解决了,感谢你们!
代码贴出来和大家分享一下~ MFC 程序运行一段时间就没有画面,卡死了 求MFC大神帮忙~~
void CTrafficView::drawCar(int x, int y)
{
// load IDB_BITMAP1 from our resources
   CDC *pDC;
   pDC=GetDC();


   CBitmap bmp;
   if (bmp.LoadBitmap(IDB_BITMAP1))
   {
      BITMAP bmpInfo;
      bmp.GetBitmap(&bmpInfo);

      CDC dcMemory;
      dcMemory.CreateCompatibleDC(pDC);
      CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);

      CRect rect;
      GetClientRect(&rect);

      pDC->BitBlt(x, y, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 
         0, 0, SRCCOPY);

      dcMemory.SelectObject(pOldBitmap);
   }
   else
      TRACE0("ERROR: Where's IDB_BITMAP1?\n");

    ReleaseDC(pDC);
  }