程序运行一段时间出错

yeedward 2004-08-24 04:56:51
大家帮忙看下这个程序http://www.vckbase.com/document/viewdoc/?id=1129

我的程序继承了这个框架 也继承了这个程序的毛病

把这个程序开一段时间也会自动退出 -->把DrawTest.cpp SetTimer(1,50,NULL);
改为SetTimer(1,20,NULL);

间隔越小死的越快

究竟哪有问题 希望各位了解内存问题的高手帮帮我 谢谢

另外我不能回帖 望斑竹原谅 我不是故意发重复的帖 一得到答案马上结帖

另外再给30分 希望回答的人多点
...全文
161 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liutian32 2004-08-25
  • 打赏
  • 举报
回复
调用pDC->DeleteDC();是不正确的,用GetDC()获得的dc必须调用ReleaseDC()来释放。看MSDN

An application must not delete a device context whose handle was obtained by calling the GetDC function. Instead, it must call the ReleaseDC function to free the device context.


yeedward 2004-08-25
  • 打赏
  • 举报
回复
谢谢以上2位 我这里分都给liutian32()



tabby(内存泄漏) 请去

http://community.csdn.net/Expert/topic/3303/3303333.xml?temp=.5681879

领分

内存泄漏 2004-08-25
  • 打赏
  • 举报
回复
确实有内存泄漏的问题,在上面函数的倒数第二行:
memBitmap.DeleteObject();后面添加代码:
pDC->DeleteDC();

问题解决。
liutian32 2004-08-25
  • 打赏
  • 举报
回复
我测试了一下,源程序果然在运行一段时间后出现问题,我看了以下DrawWave函数,应该没有问题,但是在OnTimer函数中我发现pDC 没有释放,调用了GetDC()后必须调用ReleaseDC()函数来释放DC,这种小失误很难发现,所以在编写代码时对常用的函数的使用一定要有个定式
liutian32 2004-08-25
  • 打赏
  • 举报
回复
void CDrawTest::OnTimer(UINT nIDEvent)
{
CRect rect;

CWnd* pWnd = GetDlgItem(IDC_COORD);

pWnd->GetClientRect(&rect);
pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();

//pDC->Rectangle(&rect);

CBitmap memBitmap;
CBitmap* pOldBmp = NULL;
memDC.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
pOldBmp = memDC.SelectObject(&memBitmap);
memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);
DrawWave(&memDC);
pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);

ReleaseDC(pDC);//<--------------------------******必须释放*******

memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
memBitmap.DeleteObject();

CDialog::OnTimer(nIDEvent);
}
菜牛 2004-08-25
  • 打赏
  • 举报
回复
小于50毫秒的定时器没有意义。
他的问题可能是在DrawWave里面,没有细看。
不过这段代码效率本身就很低,定时器设得小的话,可能是有问题,你把定时器设到100试试。
yeedward 2004-08-25
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1129这里可以下代码
void CDrawTest::OnTimer(UINT nIDEvent)
{
CRect rect;

CWnd* pWnd = GetDlgItem(IDC_COORD);

pWnd->GetClientRect(&rect);
pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();

//pDC->Rectangle(&rect);

CBitmap memBitmap;
CBitmap* pOldBmp = NULL;
memDC.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
pOldBmp = memDC.SelectObject(&memBitmap);
memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);
DrawWave(&memDC);
pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);

memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
memBitmap.DeleteObject();

CDialog::OnTimer(nIDEvent);
}
bohut 2004-08-25
  • 打赏
  • 举报
回复
把OnTimer()函数里面的内容贴出来
yeedward 2004-08-25
  • 打赏
  • 举报
回复
应用程序发生异常unkown software exception (0x80000003),位置为0x77f813b1

但是我同事的机子运行也有问题

大家请再试一下 把那个绘图的对话框打开一段时间出
这个地方改以下-->把DrawTest.cpp SetTimer(1,50,NULL);
改为SetTimer(1,20,NULL);

好象这里运行一定次数就出错
holyeagle 2004-08-24
  • 打赏
  • 举报
回复
没有问题啊,楼主换个机器试试看
oyljerry 2004-08-24
  • 打赏
  • 举报
回复
贴一下错误啊
zhaogaojian 2004-08-24
  • 打赏
  • 举报
回复
我的没问题

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧