Java SWT没有更多的手柄,但应该有
在Eclipse RCP应用程序中,我得到一个异常:Java SWT没有更多的手柄,但应该有,java,swt,Java,Swt,在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.ja
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.
通过process explorer(MS sysiternals),我可以看到:
Handles 215
GDI Handles 48
USER Handles 23
根据这些信息,我认为这不是一个遗漏的问题
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());
}
有人知道我可以从哪里着手分析问题吗
谢谢 不幸的是,并非所有“不再有句柄”错误实际上都是由句柄的过度使用引起的。举个例子,看看我刚才报道的这个
在您的情况下,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
中所述
更简单的方法是使用调试器:当
CreateWindowEx
在Shell:660处返回0时,放置一个(有条件的)断点停止,并检查OS.GetLastError()
值。如果可能,请与我们分享问题的原因,以及可能的解决方案。我很好奇到底出了什么问题。我的意思是,当应用程序处于这种状态时,不仅工具提示不再起作用,而且不能打开新的对话框。因此,您可以在Control.createHandle行704中设置断点,检查句柄是否为0,然后在Expression视图中添加“org.eclipse.swt.internal.win32.OS.GetLastError()”,并查看结果为0。@keinfarbton您所拥有的只是上面链接的CreateWindowEx
的MSDN规范。根据那里的注释,函数确实会返回NULL,并且仍然将last error设置为0。它们还列出了典型的错误原因。很抱歉,我的回答没有帮助。