【问题标题】:Accessing the current processes handles访问当前进程句柄
【发布时间】:2019-10-30 14:34:59
【问题描述】:

在我们的 RCP 4 应用程序中,由于没有可用的句柄,我们抛出了 SWT 异常。这可能是由资源泄漏或正在运行的其他第 3 方应用程序引起的。我们无法在开发中重现此问题,因此我们希望记录任何可能帮助我们在未来解决此问题的信息。

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

我一直在查找此内容,并且正在努力寻找有关如何在 Java 中完成此操作的任何信息。我们可以执行命令行获取信息,但这感觉不是一个好方法。

Handles 我指的是 Windows 上的 GDI HandlesUser Handles

如何做到这一点?

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>

【问题讨论】:

  • 什么是“句柄”以及限制有多大差异,具体取决于您运行的平台。
  • 我已经更新了问题。我的意思是 Windows 操作系统上的 GDI 和用户句柄。
  • 对于使用 3.x 兼容层的 RCP,您可以使用 Eclipse Sleak(在this tutorlal 中描述)之类的东西。对于 e4 RCP,我什么都不知道。
  • @greg-449 不幸的是,我们的应用程序是纯 e4/RCP 4。Sleak 如何访问这些信息?这在代码中是可能的吗?
  • 这是一小段易于阅读的代码see here。但它依赖于使用 DeviceData 对象创建的 SWT Display - E4Application 不会这样做。

标签: java windows swt e4


【解决方案1】:

Eclipse Sleak 可以监控 SWT 所做的分配 - 代码是 here

但是,这需要使用启用跟踪的 DeviceData 对象创建 SWT Display。标准的E4Application 没有这样做。

因此,要使用它,您需要使用自己的扩展 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 的产品

【讨论】:

  • 如果是产品,如何在plugin.xml 中做到这一点?我已经更新了我的问题,以展示我们的一个精简示例。我尝试将application 更改为自定义,但Application "my.custom.E4Application" could not be found in the registry 抛出错误。我还尝试添加基数、线程和可见属性。
  • 看起来应用程序 ID 可能是错误的。应用程序id是org.eclipse.core.runtime.applicationsextensionid参数的值,前面加了插件。因此,在我的示例中,如果插件 ID 为“my.plugin”,则应用程序 ID 为“my.plugin.application”
  • 我认为ID是对的 我只是在我给出的示例中错误地重命名了它?我已经更新了它。我已经多次阅读您的评论,但我让自己感到困惑。在您的示例中,应用程序 ID 设置在哪里?我很难看到我需要对我的 plugin.xml 进行更改。
  • 它由'org.eclipse.core.runtime.applications''extension'第二行中的id="application"定义。然后需要使用该 ID product application - 请参阅更新的示例。请注意,应用程序 ID 不是 Java 类名。
  • 就是这样。感谢您提供他们真正帮助的额外示例!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
相关资源
最近更新 更多