【问题标题】:SWT no more handles, but there should beSWT没有更多的句柄,但应该有
【发布时间】:2013-11-25 14:56:35
【问题描述】:

在 Eclipse RCP 应用程序中,我得到了异常:

org.eclipse.swt.SWTError: No more handles
at org.eclipse.swt.SWT.error(SWT.java:4423)
at org.eclipse.swt.SWT.error(SWT.java:4312)
at org.eclipse.swt.SWT.error(SWT.java:4283)
at org.eclipse.swt.widgets.Widget.error(Widget.java:472)
at org.eclipse.swt.widgets.Shell.createToolTipHandle(Shell.java:660)
at org.eclipse.swt.widgets.Shell.toolTipHandle(Shell.java:1944)
...

我添加了 Sleak 工具来跟踪资源是否存在泄漏。 那没有。偷偷告诉你有

63 Colors, 5 Cursors, 4 Fonts, 75 Images.

使用进程资源管理器(MS sysiternals)我看到了这个:

Handles 215
GDI Handles 48
USER Handles 23

根据这些信息,我认为这不是丢失的处置问题。

有人知道我可以在哪里继续分析问题吗?

谢谢!

【问题讨论】:

  • 如果可能,请与我们分享问题的原因,也许是解决方案。我很好奇出了什么问题。

标签: java swt


【解决方案1】:

不幸的是,并非所有“不再有句柄”错误实际上都是由句柄的过度消耗引起的。比如我刚才报道的这个SWT bug

在您的情况下,CreateWindowEx 返回 NULL。由于我无法重现该问题,我不知道下面的代码是否可以工作,但我希望它可以工作。如果没有,请将其转换为 C 并在本机方法中调用它。我不知道最后一个错误是否被 SWT 中的任何其他内部代码重置。当您获得GetLastError() 的结果后,您将进入下一步解决问题。

    int toolTipHandle = OS.CreateWindowEx (0, new TCHAR(0, OS.TOOLTIPS_CLASS, true), null,
                    OS.TTS_ALWAYSTIP | OS.TTS_NOPREFIX, OS.CW_USEDEFAULT, 0, OS.CW_USEDEFAULT, 0, shell.handle, 0,
                    OS.GetModuleHandle(null), null);
    if (toolTipHandle == 0) {
        System.out.println(OS.GetLastError());
    }

由于这是一个工具提示创建,我建议您将工具提示设置为null,并在SWT.MouseHover事件上调用此代码。


编辑:想法是调用GetLastError() 函数,如CreateWindowEx MSDN page 中所述。

更简单的方法是使用调试器:当CreateWindowEx 在 Shell:660 返回 0 时停止(条件)断点并检查 OS.GetLastError() 值。

【讨论】:

  • 我的意思是,当应用程序处于该状态时,不仅工具提示不再起作用,也无法打开新对话框。因此可以在 Control.createHandle 的第 704 行设置一个断点,检查句柄是否为 0,然后在 Expression 视图中添加“org.eclipse.swt.internal.win32.OS.GetLastError()”并查看结果为 0。
  • @keinfarbton 您所拥有的只是上面链接的CreateWindowEx 的 MSDN 规范。根据那里的 cmets,函数确实会返回 NULL 并且仍然将最后一个错误设置为 0。他们还列出了典型的错误原因。很抱歉我的回答没有帮助。
猜你喜欢
  • 2016-10-17
  • 1970-01-01
  • 2011-10-31
  • 2015-01-04
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
相关资源
最近更新 更多