VC程序运行一段时间后崩溃

时间:2021-03-03 00:08:45
我在Timer里面调用函数检查通道状态(16个),让后根据状态改变每个通道对应按钮的图标。程序运行一段时间后就图标就成白板了,没有响应了。

void CCh1::ShowChange2()
{
char pPhoNumBuf[4];
strcpy(pPhoNumBuf,"");
for(int i=0;i<nTotalCh;i++)
{
CBitmap Bitmap;
HBITMAP hBitmap;
CButton *pButton;
CString str,buffer;
switch(SsmGetChState(i))
{

case S_CALL_PICKUPED: 
{

Bitmap.LoadBitmap(IDB_UP);
hBitmap = (HBITMAP)Bitmap.Detach();
pButton = (CButton*)GetDlgItem(i+1074);
pButton->SetBitmap(hBitmap);
SetDlgItemText(i+1106,"摘机");


}
break;
case S_CALL_STANDBY:
{

Bitmap.LoadBitmap(IDB_DOWN);
hBitmap = (HBITMAP)Bitmap.Detach();
pButton = (CButton*)GetDlgItem(i+1074);
pButton->SetBitmap(hBitmap);
SetDlgItemText(i+1106,"空闲");


}
break;
case S_CALL_WAIT_REMOTE_PICKUP:
{
Bitmap.LoadBitmap(IDB_DOWN);
hBitmap = (HBITMAP)Bitmap.Detach();
pButton = (CButton*)GetDlgItem(i+1074);
pButton->SetBitmap(hBitmap);
SetDlgItemText(i+1106,"空闲");

}
break;
 case S_CALL_OFFLINE:
{

Bitmap.LoadBitmap(IDB_OUTLINE); 
hBitmap = (HBITMAP)Bitmap.Detach();
pButton = (CButton*)GetDlgItem(i+1074);
pButton->SetBitmap(hBitmap);
SetDlgItemText(i+1106,"断线");

}
break;
}
}
}

17 个解决方案

#1


只是图标没反应,还是整个窗口没反应?

如果是整个窗口没反应的话,可能是你的UI线程里做的太多事情

#2


http://blog.csdn.net/na_he/article/details/7429171

#3


使用的资源没有释放,在不停的增加

#4


整个窗口没反映,不知道怎么改

#5


记住每次用到的Bitmap对象,在下次loadbitmap前先释放

Bitmap.DeleteObject();//先干这个,释放前面load过的bitmap对象
Bitmap.LoadBitmap(IDB_DOWN);
hBitmap = (HBITMAP)Bitmap.Detach();
pButton = (CButton*)GetDlgItem(i+1074);
pButton->SetBitmap(hBitmap);
SetDlgItemText(i+1106,"空闲");

#6


引用 5 楼  的回复:
记住每次用到的Bitmap对象,在下次loadbitmap前先释放

Bitmap.DeleteObject();//先干这个,释放前面load过的bitmap对象
Bitmap.LoadBitmap(IDB_DOWN);
hBitmap = (HBITMAP)Bitmap.Detach();
pButton = (CButton*)GetDlgItem(i+1074);
pButto……


或者把Bitmap变成你的一个类成员变量,不要用Detach()

#7


按说应该是每个通道对应一个CBitmap对象,这些CBitmap对象作为类成员变量,不能用临时变量

#8


是资源消耗完了,只使用没释放.你把这个变量定义成全局试试:
CButton *pButton;

#9


HBITMAP SetBitmap( HBITMAP hBitmap );
Return Value
The handle of a bitmap previously associated with the button.
怎么处理了?



#10


你处理的方式很有问题
通过Detach的方式获取一个被分离的句柄
而且没有及时释放
建议你合理组织位图句柄
记住用过之后要及时复位

#11


改过之后,运行半个小时 ,还是崩溃。时有时无,整个程序外框架没了

#12


这种情况,很明显是GDI资源使用后没有释放!
程序运行后,你打开任务管理器,在 查看--选择列,里面,勾上 GDI 对象,然后,你看看你的程序里面的GDI对象是不是不停的增加!
GDI资源是有限的,要养成使用后释放的好习惯。比如dc,bitmap,pen brush等,建议查看MSDN

#13


明显的资源没有释放,GDI画图的通病,用完一次绘图资源必须要释放掉

#14


求大哥们帮我改改 刚学这个不太会

#15


每次Load前调用CBitmap类的
DeleteObject() 方法释放资源。

#16


上转你的程序到资源(0分)。谁有空帮你改改。

#17


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法

#1


只是图标没反应,还是整个窗口没反应?

如果是整个窗口没反应的话,可能是你的UI线程里做的太多事情

#2


http://blog.csdn.net/na_he/article/details/7429171

#3


使用的资源没有释放,在不停的增加

#4


整个窗口没反映,不知道怎么改

#5


记住每次用到的Bitmap对象,在下次loadbitmap前先释放

Bitmap.DeleteObject();//先干这个,释放前面load过的bitmap对象
Bitmap.LoadBitmap(IDB_DOWN);
hBitmap = (HBITMAP)Bitmap.Detach();
pButton = (CButton*)GetDlgItem(i+1074);
pButton->SetBitmap(hBitmap);
SetDlgItemText(i+1106,"空闲");

#6


引用 5 楼  的回复:
记住每次用到的Bitmap对象,在下次loadbitmap前先释放

Bitmap.DeleteObject();//先干这个,释放前面load过的bitmap对象
Bitmap.LoadBitmap(IDB_DOWN);
hBitmap = (HBITMAP)Bitmap.Detach();
pButton = (CButton*)GetDlgItem(i+1074);
pButto……


或者把Bitmap变成你的一个类成员变量,不要用Detach()

#7


按说应该是每个通道对应一个CBitmap对象,这些CBitmap对象作为类成员变量,不能用临时变量

#8


是资源消耗完了,只使用没释放.你把这个变量定义成全局试试:
CButton *pButton;

#9


HBITMAP SetBitmap( HBITMAP hBitmap );
Return Value
The handle of a bitmap previously associated with the button.
怎么处理了?



#10


你处理的方式很有问题
通过Detach的方式获取一个被分离的句柄
而且没有及时释放
建议你合理组织位图句柄
记住用过之后要及时复位

#11


改过之后,运行半个小时 ,还是崩溃。时有时无,整个程序外框架没了

#12


这种情况,很明显是GDI资源使用后没有释放!
程序运行后,你打开任务管理器,在 查看--选择列,里面,勾上 GDI 对象,然后,你看看你的程序里面的GDI对象是不是不停的增加!
GDI资源是有限的,要养成使用后释放的好习惯。比如dc,bitmap,pen brush等,建议查看MSDN

#13


明显的资源没有释放,GDI画图的通病,用完一次绘图资源必须要释放掉

#14


求大哥们帮我改改 刚学这个不太会

#15


每次Load前调用CBitmap类的
DeleteObject() 方法释放资源。

#16


上转你的程序到资源(0分)。谁有空帮你改改。

#17


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法