访问当前进程句柄
Accessing the current processes handles
在我们的 RCP 4 应用程序中,由于没有更多可用句柄,我们抛出了 SWT 异常。这可能是由资源泄漏或其他第 3 方应用程序 运行 引起的。我们无法在开发中重现此问题,因此我们希望记录任何可能有助于我们在未来解决此问题的信息。
我们想了解有关句柄的信息。例如。总句柄及其用途,例如图像、字体和复合材料。
我一直在查找这个,我正在努力寻找有关如何在 Java 中完成此操作的任何信息。我们可以执行命令行来获取信息,但这并不是一个很好的方法。
Handles
我指的是 GDI Handles
和 User Handles
Windows。
如何做到这一点?
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>
Eclipse Sleak 可以监控 SWT 所做的分配 - 代码是 here。
然而,这需要创建 SWT Display
并使用 DeviceData
对象启用跟踪。标准 E4Application
不会这样做。
因此,要使用它,您需要使用自己的应用程序 class 扩展 E4Application - 类似于:
import org.eclipse.e4.ui.internal.workbench.swt.E4Application;
import org.eclipse.swt.graphics.DeviceData;
import org.eclipse.swt.widgets.Display;
public class MyApplication extends E4Application
{
/** Enable tracking */
private static final boolean TRACKING = true;
/** Enable debug */
private static final boolean DEBUG = false;
public MyApplication()
{
super();
}
@Override
public Display getApplicationDisplay()
{
Display current = Display.getCurrent();
if (current == null)
{
if (TRACKING || DEBUG)
{
DeviceData data = new DeviceData();
data.tracking = TRACKING;
data.debug = DEBUG;
current = new Display(data);
if (data.tracking)
{
Sleak sleak = new Sleak();
sleak.open();
}
}
else
{
current = new Display();
}
}
return super.getApplicationDisplay();
}
}
您需要在 plugin.xml:
中声明此应用程序
<extension
id="application"
name="Application name"
point="org.eclipse.core.runtime.applications">
<application
cardinality="singleton-global"
thread="main"
visible="true">
<run
class="your.package.MyApplication">
</run>
</application>
</extension>
更改 plugin.xml 中的产品声明以使用此应用程序而不是 org.eclipse.e4.ui.workbench.swt.E4Application
。所以像:
<extension
id="product"
point="org.eclipse.core.runtime.products">
<product
name="%product.name"
application="my.plugin.application">
作为进一步的示例,以下是来自我的一个 e4 RCP 的经过测试的工作 plugin.xml 的一部分:
<plugin>
<extension
id="application"
name="%app.name"
point="org.eclipse.core.runtime.applications">
<application
cardinality="singleton-global"
thread="main"
visible="true">
<run
class="greg.music.e4.rcp.MusicApplication">
</run>
</application>
</extension>
<extension
id="product"
point="org.eclipse.core.runtime.products">
<product
name="%product.name"
application="greg.music.e4.rcp.application">
...... properties
</product>
</extension>
这是在 ID 为 greg.music.e4.rcp
的插件中。这定义了一个 ID 为 greg.music.e4.rcp.application
的应用程序和一个 ID 为 greg.music.e4.rcp.product
的产品
在我们的 RCP 4 应用程序中,由于没有更多可用句柄,我们抛出了 SWT 异常。这可能是由资源泄漏或其他第 3 方应用程序 运行 引起的。我们无法在开发中重现此问题,因此我们希望记录任何可能有助于我们在未来解决此问题的信息。
我们想了解有关句柄的信息。例如。总句柄及其用途,例如图像、字体和复合材料。
我一直在查找这个,我正在努力寻找有关如何在 Java 中完成此操作的任何信息。我们可以执行命令行来获取信息,但这并不是一个很好的方法。
Handles
我指的是 GDI Handles
和 User Handles
Windows。
如何做到这一点?
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>
Eclipse Sleak 可以监控 SWT 所做的分配 - 代码是 here。
然而,这需要创建 SWT Display
并使用 DeviceData
对象启用跟踪。标准 E4Application
不会这样做。
因此,要使用它,您需要使用自己的应用程序 class 扩展 E4Application - 类似于:
import org.eclipse.e4.ui.internal.workbench.swt.E4Application;
import org.eclipse.swt.graphics.DeviceData;
import org.eclipse.swt.widgets.Display;
public class MyApplication extends E4Application
{
/** Enable tracking */
private static final boolean TRACKING = true;
/** Enable debug */
private static final boolean DEBUG = false;
public MyApplication()
{
super();
}
@Override
public Display getApplicationDisplay()
{
Display current = Display.getCurrent();
if (current == null)
{
if (TRACKING || DEBUG)
{
DeviceData data = new DeviceData();
data.tracking = TRACKING;
data.debug = DEBUG;
current = new Display(data);
if (data.tracking)
{
Sleak sleak = new Sleak();
sleak.open();
}
}
else
{
current = new Display();
}
}
return super.getApplicationDisplay();
}
}
您需要在 plugin.xml:
中声明此应用程序 <extension
id="application"
name="Application name"
point="org.eclipse.core.runtime.applications">
<application
cardinality="singleton-global"
thread="main"
visible="true">
<run
class="your.package.MyApplication">
</run>
</application>
</extension>
更改 plugin.xml 中的产品声明以使用此应用程序而不是 org.eclipse.e4.ui.workbench.swt.E4Application
。所以像:
<extension
id="product"
point="org.eclipse.core.runtime.products">
<product
name="%product.name"
application="my.plugin.application">
作为进一步的示例,以下是来自我的一个 e4 RCP 的经过测试的工作 plugin.xml 的一部分:
<plugin>
<extension
id="application"
name="%app.name"
point="org.eclipse.core.runtime.applications">
<application
cardinality="singleton-global"
thread="main"
visible="true">
<run
class="greg.music.e4.rcp.MusicApplication">
</run>
</application>
</extension>
<extension
id="product"
point="org.eclipse.core.runtime.products">
<product
name="%product.name"
application="greg.music.e4.rcp.application">
...... properties
</product>
</extension>
这是在 ID 为 greg.music.e4.rcp
的插件中。这定义了一个 ID 为 greg.music.e4.rcp.application
的应用程序和一个 ID 为 greg.music.e4.rcp.product