Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问当前进程句柄_Java_Windows_Swt_E4 - Fatal编程技术网

Java 访问当前进程句柄

Java 访问当前进程句柄,java,windows,swt,e4,Java,Windows,Swt,E4,在我们的RCP4应用程序中,由于没有更多可用句柄,我们引发了SWT异常。这可能是由资源泄漏或运行的其他第三方应用程序引起的。我们无法在开发中复制此信息,因此我们希望记录可能有助于我们在将来解决此问题的任何信息 我们想了解有关手柄的信息。例如,总句柄及其用途,如图像、字体和合成 我一直在查找这个问题,我正在努力寻找如何在Java中实现这一点的方法。我们可以为信息执行命令行,但这并不是一种很好的方式 通过句柄我指的是Windows上的GDI句柄和用户句柄 如何做到这一点 plugin.xml &l

在我们的RCP4应用程序中,由于没有更多可用句柄,我们引发了SWT异常。这可能是由资源泄漏或运行的其他第三方应用程序引起的。我们无法在开发中复制此信息,因此我们希望记录可能有助于我们在将来解决此问题的任何信息

我们想了解有关手柄的信息。例如,总句柄及其用途,如图像、字体和合成

我一直在查找这个问题,我正在努力寻找如何在Java中实现这一点的方法。我们可以为信息执行命令行,但这并不是一种很好的方式

通过
句柄
我指的是Windows上的
GDI句柄
用户句柄

如何做到这一点

plugin.xml

<plugin>
   <extension
         id="product"
         point="org.eclipse.core.runtime.products">
      <product
            application="org.eclipse.e4.ui.workbench.swt.E4Application"
            name="appid">
         <property
               name="modelResourceHandler"
               value="bundleclass://a.model.resource.handler.ModelResourceHandler">
         </property>
      </product>
   </extension>
</plugin>

EclipseSLEAK可以监视SWT进行的分配-代码是

但是,这需要使用启用跟踪的
DeviceData
对象创建SWT
显示。标准的
e4应用程序
不这样做

因此,要使用它,您需要使用自己的应用程序类扩展E4Application—类似于:

import org.eclipse.e4.ui.internal.workbench.swt.e4应用程序;
导入org.eclipse.swt.graphics.DeviceData;
导入org.eclipse.swt.widgets.Display;
公共类MyApplication扩展了E4Application
{
/**启用跟踪*/
私有静态最终布尔跟踪=true;
/**启用调试*/
私有静态最终布尔调试=false;
公共应用程序()
{
超级();
}
@凌驾
公共显示getApplicationDisplay()
{
Display current=Display.getCurrent();
如果(当前==null)
{
如果(跟踪| |调试)
{
DeviceData数据=新的DeviceData();
数据跟踪=跟踪;
data.debug=debug;
当前=新显示(数据);
if(数据跟踪)
{
Sleak Sleak=新Sleak();
sleak.open();
}
}
其他的
{
当前=新显示();
}
}
返回super.getApplicationDisplay();
}
}
您需要在plugin.xml中声明此应用程序:


更改plugin.xml中的产品声明以使用此应用程序,而不是
org.eclipse.e4.ui.workbench.swt.E4Application
。比如:


作为另一个示例,以下是我的e4 RCP之一中经过测试的工作plugin.xml的一部分:


...... 性质

这是一个id为
greg.music.e4.rcp
的插件。这定义了一个id为
greg.music.e4.rcp.application
的应用程序和一个id为
greg.music.e4.rcp.product

的产品,什么是“句柄”以及限制是什么,这取决于您运行的平台。我已经更新了这个问题。我指的是Windows操作系统上的GDI和用户句柄。对于使用3.x兼容层的RCP,您可以使用类似EclipseSLEAK的东西(如中所述)。对于e4 RCP,我什么都不知道。@greg-449不幸的是,我们的应用程序是纯e4/RCP4。Sleak如何访问这些信息?这是代码中可以实现的吗?这是一个非常小的代码,易于阅读。但是它依赖于使用
DeviceData
对象创建的SWT
Display
,而
E4Application
不这样做。如果它是一个产品,如何在
plugin.xml
中做到这一点?我更新了我的问题,展示了我们的一个简化示例。我已尝试将
应用程序更改为自定义应用程序,但在注册表中找不到
应用程序“my.custom.E4Application”时抛出错误。我还尝试添加了基数、线程和可见属性。看起来应用程序id可能是错误的。应用程序id是org.eclipse.core.runtime.applications
extension
id
参数的值,前面添加了插件。因此,在我的示例中,如果插件id是'my.plugin',那么应用程序id是'my.plugin.application',我认为id是正确的,我只是在我给出的示例中错误地重命名了它?我已经更新了。我已经把你的评论读了好几遍了,但是我把自己弄糊涂了。在您的示例中,应用程序id设置在哪里?我很难看到我需要对plugin.xml进行哪些更改才能做到这一点。它是由“org.eclipse.core.runtime.applications”扩展的第二行中的
id=“application”
定义的。然后需要将id用于
产品
应用程序
-请参阅更新的示例。请注意,应用程序id不是Java类名。感谢您提供了他们真正帮助的额外示例!