我的Eclipse项目中有一个构建文件。此文件执行的操作之一是使用<input/>
标记通过提示询问问题。自升级到Eclipse Helios以来,这不再有效,因为我收到以下错误:
[input] ***WARNING: Display must be created on main thread due to Cocoa restrictions.
Invalid thread access
如何解决此错误?
答案 0 :(得分:3)
看起来像 bug 303869
我已向Apple提交了功能请求:错误ID#7840189 如果我们有可能通过这个新的Dispatch在主线程上运行显示代码 对象/方法,我认为SWT可以在不改变太多代码的情况下在applet中工作,不是吗?
同时检查bug 288436以查看它是否与您的情况相关。
答案 1 :(得分:2)
关于我之前的回答,这两个错误现在都已关闭。
特别是bug 303869本月早些时候关闭了:
我认为我们可以关闭这个错误,现在可以使用最新的Mac OS X 10.6 Java更新。
我们可以在主线程上执行代码,现在显示UI。在applet中,我们使用如下代码来实例化显示:
com.apple.concurrent.Dispatch.getInstance().getNonBlockingMainQueueExecutor().execute(
new Runnable(){
@Override
public void run() {
if( dDisplay == null )
{
dDisplay = Display.getDefault();
sShell = SWT_AWT.new_Shell(dDisplay, cCanvas);
mLogger.info("Display is created");
}
...
}
} );
...
感谢所有人,尤其是来自Apple的Mike解决了这个问题 与SWT IMHO没什么关系。
是的,JNLP文件有一个小错误,触发了问题 在没有任何其他属性的“
<j2se version="1.6*" />
”标记中指定“<resources>
”会丢弃JNLP解析器并导致后面的行“<j2se version="1.6*" java-vm-args="-XstartOnFirstThread"/>
”被忽略。
这两行最终指向两个独立的JVM,第一个规范是“获胜”。该规范上没有VM参数,因此JVM正常启动,并且SWT加载在错误的线程上。
bug 211625中提到了-XstartOnFirstThread
选项:
这是必需的,因为Cocoa要求所有用户事件调度必须在线程0上发生。
如果没有-XstartOnFirstThread
,Display将在非主线程上创建NSApplication
,并且SWT将无法从非主线程中提取和分派事件。
使用-XstartOnFirstThread
选项时要小心:谎言bug mentions:
原因是新的开发者模式在Swing中实现,旧的托管模式在SWT中实现。
SWT要求-XstartOnFirstThread在Mac上运行 但是这会破坏任何使用Swing的java程序。因此,您无法从2.0版本向前添加
-XstartOnFirstThread
。然而,在旧版本中,它仍然是一项要求。
答案 2 :(得分:1)
最后找到了解决这个问题的方法:
首先,确保您的Java版本是最新的(编写本文时的1.6.0.20)。其次,通过执行以下操作来更改Ant运行时参数:
-XstartOnFirstThread