No more handles swt eclipse插件开发

本文介绍了在Eclipse开发环境中,由于Image对象未正确管理资源导致GDI句柄耗尽的问题,并提供了解决方案。包括缓存Image对象、合理复用ImageDescriptor以及适当缩小图像大小的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

!ENTRY org.eclipse.ui 4 0 2006-08-03 14:16:30.394 
!MESSAGE No more handles 
!STACK 0 
org.eclipse.swt.SWTError: No more handles 
at org.eclipse.swt.SWT.error(SWT.java:2966) 
at org.eclipse.swt.SWT.error(SWT.java:2863) 
at org.eclipse.swt.SWT.error(SWT.java:2834) 
at org.eclipse.swt.widgets.Widget.error(Widget.java:395) 
at org.eclipse.swt.widgets.Control.createHandle(Control.java:482) 

 

1. 解决方法,给Imageg对象创建缓存。方法有很多。下面提供其中一种方法。

ImageRegistry registry = Activator.getDefault().getImageRegistry();

        Image image = registry.get(key);
        if(image == null){
            ImageDescriptor descriptor = getImageDescriptor(key);
            image  = descriptor.createImage();
            registry.put(key, image);
        }
         
        return image;
===============================
就是放到 register 中来使用,同理 ImageDescriptor。。

 

2. 出现这个问题的原因

 

错误原因1:自己创建(new)Image、Font、Cursor等没有自己dispose掉,导致占用的Windows 的 GDI对象句柄非常多,Windows 的 GDI句柄不够用,这个很经常出现,改起来也比较容易

 

 

解决方法1:自己创建后一定要保存这些引用,在适当的时机进行dispose掉,如果是方法内部,最好在finally块中dispose。

 

 

错误原因2:Image没有得到合适的重用,导致句柄过多,虽然这个原因和第一个差不多,但是还是要分别列出一点,这样也可以培养大家狠好的编程经验吧,就是同样一个地方出现的image应该是相同,比如一个TreeViewer显示在一个View里,你现在想在一个Wizard显示这个Treeviewer,如果你是是新建的一个Treeviewer,那就应该使用同样的Provider,这样使得图像都用的同一个,而不会新开辟,这样就能减少GDI句柄的使用。

 

 

解决方法2:使用ImageDescriptor进行重用

 

 

错误原因3:也是我这次遇到的问题,我这次新建的Image大小达15000*4000,可以说是非常大的一张图像,有些计算机是开辟不了这么大的,对于非常大的图像,你打开以后,有时候会提示The image is too large,这说明你的计算机开辟不了这么大的图像。

 

 

解决方法3:适当等比例缩小图像,有时候会是因为你的程序开辟内存太小,在java启动参数扩大内存,至于有没有办法配置windows使其支持更大的图像,至今没有找到,如果谁找到了,请不吝赐教

 

 

提供一点,虽然是no more handle,不代表就一定是没有足够的句柄,也有可能跟第三个一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在键盘上跳舞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值