经理要我改一个程序。它在xp下运行的时候没什么问题,但是在98下运行久后就会出现“系统资源不足” 请问各位,在什么情况下会出现这种情况? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我记得TransparentBlt这个API会这样在98下会引起资源泄漏在2k以上没事 只有一个原因,pen,font ,bitmap等未能释放。 to kingcom_xu(刀是用来杀人的!) 没有发现TransparentBlt 用boundschecker察察哪个函数有问题 pen,font ,bitmap怎么释放??不好意思我的是不懂 DeleteObject();里面是pen,font,等等 如果不放在循环里不释放也无所谓,但是如果像CPen PEN;WHILE(TURE){PEN.CREATEPEN(...);PEN.DELETEOBJECT();//必须做} to fingerfox(foxfinger)我上面好象也没有WHILE(TURE) gdi对象稍微多点就完蛋了,大概是1000吧。我是过,98下开6个空vc,就会报资源不足。一定要及时释放gdi。记得是及时,不是最后一起释放。 另外找一个能查看98下gdi资源的工具,就像2000的的任务管理器一样的东西。我用的是Cool tray 1.0.0版,去网上找找看。 不一定是WHILE(true)只要是循环那样就不行 怎样使用boundschecker??-----------]先安装boundschecker菜单-〉boundschecker->view->boundschecker选几个你要测试的操作系统 确定就会列出一个报告说哪个函数再哪个系统中无法运行! sorry 粘错了菜单-〉boundschecker->view->菜单-〉compliance report.... 这是典型的资源泄漏,以前我们也碰到过。你可以现用98的资源查看器看看是什么资源用光了,如果是GDI资源,那就一定是你的程序中使用了图形对象,譬如说:你在一个函数中声明了一个Bitmap对象,但是在退出函数时你没有调用Bitmap对象的释放功能,在2000和Xp下,系统会自动释放局部变量的图形资源,但是98下不会。你可以试试。 仔细看 MSDN 中各种资源的释放方法. 别看MFC部分的, 看 PLATFORM SDK 部分的. 这位老兄和我撞见一样的问题了, 前一段时间谢一个数据采集的程序,我使用非模态对话框显示各个采集点的数据,总共最多有512个。每个对话框中都用了许多的Windows标准控制。每个窗口显示8点,结果...。于是,我使用一个线程接受数据,然后发送到各个窗口,窗口接收数据以后自己绘制图形(模仿标准控制)这样使用一个绘图处理器在Windows98下面也可以了。你是否可以借鉴一下呢?关于在Windows98和WindowNT中,各种系统资源的数目你可以参考《Windows图形编程》。 我构造用CPen *rPen=new CPen(PS_SOLID, 2, RGB(255,0,0));释放用 delete rPen;怎么还是不能解决问题,我错在那里?? 我是发现我的gdi慢慢的变少,我是在ontimer中调用drowpicture,在里面用到cpen font等东西,是不是无解拉。好象是内存空间无法完全释放 肯定是资源hDC,hPen等没释放,你把代码发给我,我帮你看看吧.我以前做过类似的东西,结果发现2k 下正常,98下出错,就是上面的原因. CPen *yellowPen=new CPen(PS_SOLID,1,RGB(255,255,0)); dc.SelectObject(yellowPen); dc.MoveTo(x,y);tx = (int)floor(x+m_dUA*m_iZoom/base_u*base_radius*cos(m_dUFA/180*3.14)); ty = (int)floor(y-m_dUA*m_iZoom/base_u*base_radius*sin(m_dUFA/180*3.14)); if (((tx-x)*(tx-x)+(ty-y)*(ty-y)) <= fr1) { dc.LineTo(tx, ty); if (m_dUA != 0) { dc.LineTo((int)(tx-8*cos((m_dUFA-30)/180*3.14)), (int)(ty+8*sin((m_dUFA-30)/180*3.14))); dc.MoveTo(tx, ty); dc.LineTo((int)(tx-8*cos((m_dUFA+30)/180*3.14)), (int)(ty+8*sin((m_dUFA+30)/180*3.14))); } } else { tx = (int)floor(x+(right-left)/2*cos(m_dUFA/180*3.14)); ty = (int)floor(y-(right-left)/2*sin(m_dUFA/180*3.14)); dc.LineTo(tx,ty); } delete yellowPen;这是我的在drowpicture中的代码我在ontimer中调用它感谢拉 CPen* pOldPen = dc.selectobject(yellopen);...dc.selectobject(pOldPen);没有把DC里的PEN选回去!! CPen *yellowPen=new CPen(PS_SOLID,1,RGB(255,255,0));CPen* pOldPen;//ADD pOldPen=(CPen*)dc.SelectObject(yellowPen);//MODIFY dc.MoveTo(x,y);tx = (int)floor(x+m_dUA*m_iZoom/base_u*base_radius*cos(m_dUFA/180*3.14)); ty = (int)floor(y-m_dUA*m_iZoom/base_u*base_radius*sin(m_dUFA/180*3.14)); if (((tx-x)*(tx-x)+(ty-y)*(ty-y)) <= fr1) { dc.LineTo(tx, ty); if (m_dUA != 0) { dc.LineTo((int)(tx-8*cos((m_dUFA-30)/180*3.14)), (int)(ty+8*sin((m_dUFA-30)/180*3.14))); dc.MoveTo(tx, ty); dc.LineTo((int)(tx-8*cos((m_dUFA+30)/180*3.14)), (int)(ty+8*sin((m_dUFA+30)/180*3.14))); } } else { tx = (int)floor(x+(right-left)/2*cos(m_dUFA/180*3.14)); ty = (int)floor(y-(right-left)/2*sin(m_dUFA/180*3.14)); dc.LineTo(tx,ty); }dc.SelectObject(pOldPen);//ADDyellowPen.DeleteObject();//ADD delete yellowPen; 在选Object时要保留原Object,即返回值结束时要选回原Object,并DeleteOjbect你自己创建的Object,不然资源泄漏.pOldPen=(CPen*)dc.SelectObject(yellowPen);...dc.SelectObject(pOldPen);yellowPen.DeleteObject(); 很同情你的遭遇,因为我也遇到过!我花了整整一个星期去调试,各种方法都试过了。什么资源我都释放了,可是98仍然那样。原因是在98下,其系统资源自己的回收工作可能没做好。CreatePen这种API都会泄漏资源。解决方法,在98下用LoadLibrary()用完了,再FreeLibrary to ccnuxjg() 能不能说详细一点? 我发了400分的帖子,还是没有人能够彻底的解决这个问题,后来终于皇天不负苦心人,让我给搞定了。http://expert.csdn.net/Expert/topic/1195/1195502.xml?temp=.2852442http://expert.csdn.net/Expert/topic/1204/1204109.xml?temp=.81094 这是个老问题了,Win98 下应该尽量减少重复创建 GDI 对象的次数,比如 CPen,CBrush,CBitmap, MemDC 都最好作为类成员在第一次使用时 Create ,然后在类实例撤销时释放。反复创建的结果往往导致“系统不能得到必需的资源”(我猜,可能没有即时回收释放的 GDI 句柄)。如果要求高的话,CDC::SelectObject 这种返回 CGdiObject* 的函数最好用 API SelectObject 代替,因为 MFC 会为任何找不到来源的 HGDIOBJ 句柄创建临时 CGdiObject 对象,而这种临时对象直到线程终止时才释放。 首先,你要确保你的程序里面你自己申请的资源都释放了,是由于调用GDI对象的次数太频繁之后才引起的问题,这个方法在98下面才可以正常运行。我的程序在98下面测试过,我创建Time,每0.02毫秒调用一次我的绘图函数,都能够正常运行。思路:就是在需要用的GDI对象的时候,动态载入GDI32.dll (因为CreatePen等函数的定义是在这里面的) 即LoadLibrary("GDI32.dll")HMODULE g_hGDIDLL = LoadLibrary("GDI32.dll");不用的时候再释放这个dll. 即FreeLibrary("GDI32.dll");载入之后,利用函数GetProcAddress(g_hGDI32DLL,("CreatePen"));来得到CreatePen的函数地址,再用函数指针来代替CreatePen函数。 cpen,cfont 应该在建立时就要设定释放~~~~~~~~~~~~~~~ // 画坐标轴 CPen whitePen(PS_DOT, 1, RGB(255,255,255)); CPen* pOldPen; pOldPen=(CPen*)dc.SelectObject(&whitePen); dc.SelectObject(&whitePen); dc.MoveTo(left-25,y); dc.LineTo(right+25,y); dc.MoveTo(x,top-15); dc.LineTo(x,bottom+20); dc.SelectObject(&pOldPen);//ADD whitePen.DeleteObject();//ADD我改后,还是不行 我需要多次创建cpen,cfont没有办法啊!!! pen,font ,bitmap等未能释放。 CnComm串口类的一些问题,100分求教!!! 两个程序如何通过进程互相访问??? 来来来,高手进来帮小弟一把!给个算法吧! win2k\xp下如何获得信使发送者ip地址? 能否捕获最小化所有窗口的消息? 请问,在用winsocket编程中怎样的到客户机的ip地址,谢谢! 我的VS.net 无法启动的问题 高手请教 关于类型库 有没有办法把进程保存到硬盘上,下一次可以再恢复起这个进程? 求助------鼠标绘图之B样条曲线算法 哪里去找vc中关于active x 控件编程的资料?
在98下会引起资源泄漏
在2k以上没事
没有发现TransparentBlt
CPen PEN;
WHILE(TURE)
{
PEN.CREATEPEN(...);
PEN.DELETEOBJECT();//必须做
}
我上面好象也没有WHILE(TURE)
只要是循环那样就不行
-----------]
先安装boundschecker
菜单-〉boundschecker->view->boundschecker
选几个你要测试的操作系统 确定就会列出一个报告说哪个函数再哪个系统中无法运行!
菜单-〉boundschecker->view->菜单-〉compliance report
....
CPen *rPen=new CPen(PS_SOLID, 2, RGB(255,0,0));
释放用
delete rPen;
怎么还是不能解决问题,我错在那里??
CPen *yellowPen=new CPen(PS_SOLID,1,RGB(255,255,0));
dc.SelectObject(yellowPen); dc.MoveTo(x,y);tx = (int)floor(x+m_dUA*m_iZoom/base_u*base_radius*cos(m_dUFA/180*3.14));
ty = (int)floor(y-m_dUA*m_iZoom/base_u*base_radius*sin(m_dUFA/180*3.14));
if (((tx-x)*(tx-x)+(ty-y)*(ty-y)) <= fr1)
{
dc.LineTo(tx, ty);
if (m_dUA != 0)
{
dc.LineTo((int)(tx-8*cos((m_dUFA-30)/180*3.14)),
(int)(ty+8*sin((m_dUFA-30)/180*3.14)));
dc.MoveTo(tx, ty);
dc.LineTo((int)(tx-8*cos((m_dUFA+30)/180*3.14)),
(int)(ty+8*sin((m_dUFA+30)/180*3.14)));
}
}
else
{
tx = (int)floor(x+(right-left)/2*cos(m_dUFA/180*3.14));
ty = (int)floor(y-(right-left)/2*sin(m_dUFA/180*3.14));
dc.LineTo(tx,ty);
}
delete yellowPen;
这是我的在drowpicture中的代码
我在ontimer中调用它
感谢拉
...
dc.selectobject(pOldPen);
没有把DC里的PEN选回去!!
CPen* pOldPen;//ADD
pOldPen=(CPen*)dc.SelectObject(yellowPen);//MODIFY dc.MoveTo(x,y);tx = (int)floor(x+m_dUA*m_iZoom/base_u*base_radius*cos(m_dUFA/180*3.14));
ty = (int)floor(y-m_dUA*m_iZoom/base_u*base_radius*sin(m_dUFA/180*3.14));
if (((tx-x)*(tx-x)+(ty-y)*(ty-y)) <= fr1)
{
dc.LineTo(tx, ty);
if (m_dUA != 0)
{
dc.LineTo((int)(tx-8*cos((m_dUFA-30)/180*3.14)),
(int)(ty+8*sin((m_dUFA-30)/180*3.14)));
dc.MoveTo(tx, ty);
dc.LineTo((int)(tx-8*cos((m_dUFA+30)/180*3.14)),
(int)(ty+8*sin((m_dUFA+30)/180*3.14)));
}
}
else
{
tx = (int)floor(x+(right-left)/2*cos(m_dUFA/180*3.14));
ty = (int)floor(y-(right-left)/2*sin(m_dUFA/180*3.14));
dc.LineTo(tx,ty);
}
dc.SelectObject(pOldPen);//ADDyellowPen.DeleteObject();//ADD
delete yellowPen;
结束时要选回原Object,并DeleteOjbect你自己创建的Object,不然资源泄漏.
pOldPen=(CPen*)dc.SelectObject(yellowPen);
...
dc.SelectObject(pOldPen);
yellowPen.DeleteObject();
我花了整整一个星期去调试,各种方法都试过了。什么资源我都释放了,可是98仍然那样。原因是在98下,其系统资源自己的回收工作可能没做好。
CreatePen这种API都会泄漏资源。解决方法,在98下用LoadLibrary()
用完了,再FreeLibrary
http://expert.csdn.net/Expert/topic/1204/1204109.xml?temp=.81094
HMODULE g_hGDIDLL = LoadLibrary("GDI32.dll");
不用的时候再释放这个dll. 即FreeLibrary("GDI32.dll");载入之后,利用函数GetProcAddress(g_hGDI32DLL,("CreatePen"));来得到CreatePen的函数地址,再用函数指针来代替CreatePen函数。
CPen whitePen(PS_DOT, 1, RGB(255,255,255));
CPen* pOldPen;
pOldPen=(CPen*)dc.SelectObject(&whitePen);
dc.SelectObject(&whitePen);
dc.MoveTo(left-25,y);
dc.LineTo(right+25,y);
dc.MoveTo(x,top-15);
dc.LineTo(x,bottom+20);
dc.SelectObject(&pOldPen);//ADD whitePen.DeleteObject();//ADD
我改后,还是不行