为什么这段代码运行后,程序会死掉?

zqy1999 2002-04-19 05:25:35
我在视图类中定义了一个响应菜单命令的函数,目的是要画一个不断变大的矩形,并且在函数的执行过程中,程序要能继续响应操作。代码如下(很多其他的功能我已经简化、或删除掉了):

void CTTView::OnStartRun()
{
CDC* pDC ;
pDC = this->GetDC();

CBrush brush( RGB(125,135,135) );
CBrush* OldBrush = pDC->SelectObject( &brush );

int j = 5000000;//做延时用

for( int i = 0; i <= 100; i++ )
{
//使程序能继续响应外部事件
if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE ) )
{
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}

//画矩形(x1, y1, x2, y2已经在程序的其他地方定义)
pDC->Rectangle( x1, y1, x2, y2 );
x2 += 1;
y2 += 1;

while( j-- );//延时
j = 5000000;
}

pDC->SelectObject( OldBrush );
this->ReleaseDC( pDC );///!!!!!!!这行代码好象有问题。

}
程序运行起来后,我点击这个菜单命令,在这个函数运行到一半还未结束的时候,执行关闭程序的操作,则系统弹出一个异常错误对话框。当我去掉this->ReleaseDC( pDC )(函数中的最后一行代码)这句代码后,则程序就不发生错误了。
在下不知道到底是什么原因,导致这个严重的错误,希望各位兄弟指教。
...全文
31 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zqy1999 2002-04-19
  • 打赏
  • 举报
回复
不会吧?在你的机器上不死?
虽然现在我也没有能找到原因,不过对于上面几位朋友的帮助真的非常非常感谢!
ju_feng 2002-04-19
  • 打赏
  • 举报
回复
我运行没问题啊?!

是你程序别的地方的问题吧!
awanghero 2002-04-19
  • 打赏
  • 举报
回复
你可用跟踪调试,看看在什么地方放掉了资源
比如窗口不再显示,你再调用一些与之相关的操作,系统会报一些异常的信息,通常在这些调用之前,mfc会调用一些,比如以下的代码
ASSERT(WIDOWs_HANDLE),你可以利用这些代码,找出真正的原因所在!
调试的方法是,逐步缩小错误范围。
第一遍找出出错的那个函数调用
第二遍跟踪进去
。。。
直到找到好个ASSERT宏
good luck!!!!!
zqy1999 2002-04-19
  • 打赏
  • 举报
回复
这些方法都不行,到底是怎么回事呢?
fhbkyo 2002-04-19
  • 打赏
  • 举报
回复
先删除画刷然后释放环境变量
zcpro 2002-04-19
  • 打赏
  • 举报
回复
你对WM_CLOSE单独处理一下吧
if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE ) )
{
if(msg == WM_CLOSE)
{
//这里放你的资源释放代码,如 ReleaseDC(pDC);
//再重发一次close消息
PostMessage(WM_CLOSE,...);
return;
}
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
blue_flash 2002-04-19
  • 打赏
  • 举报
回复
方法不对,使用线程吧,
还有重画的机制部队
this->ReleaseDC( pDC );///这句必须删掉



zqy1999 2002-04-19
  • 打赏
  • 举报
回复
这样:if(GetSafeHwnd() && pDC)
ReleaseDC(pDC);
还是不行。我不想用多线程。
ccnuxjg 2002-04-19
  • 打赏
  • 举报
回复
agree with zcpro(zcpro)
那是因为你点关闭后,窗口就被销毁了,然后你调用this->ReleaseDC( pDC );当然会出错。

if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE ) )
{
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}

关闭程序的消息也在这里处理,所以当你点击关闭按钮后,没法执行后面的
this->Release(pDC)
zcpro 2002-04-19
  • 打赏
  • 举报
回复
if(GetSafeHwnd() && pDC)
ReleaseDC(pDC);
再试试
snsins 2002-04-19
  • 打赏
  • 举报
回复
用线程做吧
zqy1999 2002-04-19
  • 打赏
  • 举报
回复
zcpro:
还是不行啊?
zcpro 2002-04-19
  • 打赏
  • 举报
回复
那是因为你点关闭后,窗口就被销毁了,然后你调用this->ReleaseDC( pDC );当然会出错。
你可以这样改一下:
if(GetSafeHwnd())
ReleaseDC(pDC);
zqy1999 2002-04-19
  • 打赏
  • 举报
回复
我想知道为什么?真诚的请教各位,谢谢!
yu_hl 2002-04-19
  • 打赏
  • 举报
回复
这样:
void CTTView::OnStartRun()
{
CBrush brush( RGB(125,135,135) );

int j = 5000000;//做延时用

for( int i = 0; i <= 100; i++ )
{
//使程序能继续响应外部事件
if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE ) )
{
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}

CDC* pDC ;
pDC = this->GetDC();

CBrush* OldBrush = pDC->SelectObject( &brush );
//画矩形(x1, y1, x2, y2已经在程序的其他地方定义)
pDC->Rectangle( x1, y1, x2, y2 );
x2 += 1;
y2 += 1;

while( j-- );//延时
j = 5000000;

pDC->SelectObject( OldBrush );
this->ReleaseDC( pDC );///!!!!!!!这行代码好象有问题。
}

}
leech42 2002-04-19
  • 打赏
  • 举报
回复
这样子那行代码去掉不就行了.

16,472

社区成员

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

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

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