我在运行Mac OS X雪豹和wan't从激活访问显示了OSGi包。
下面是我的激活启动方法:
@Override
public void start(BundleContext context) throws Exception {
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(new Runnable() {
@Override
public void run() {
Display display = Display.getDefault();
Shell shell = new Shell(display);
Text helloText = new Text(shell, SWT.CENTER);
helloText.setText("Hello SWT!");
helloText.pack();
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
});
}
调用此代码在Windows环境中正常工作,但在Mac OS XI部署得到以下的输出:
2009-10-14 17:17:54.050 java[2010:10003] *** __NSAutoreleaseNoPool(): Object 0x101620d20 of class NSCFString autoreleased with no pool in place - just leaking
2009-10-14 17:17:54.081 java[2010:10003] *** __NSAutoreleaseNoPool(): Object 0x100119240 of class NSCFNumber autoreleased with no pool in place - just leaking
2009-10-14 17:17:54.084 java[2010:10003] *** __NSAutoreleaseNoPool(): Object 0x1001024b0 of class NSCFString autoreleased with no pool in place - just leaking
2009-10-14 17:17:54.086 java[2010:10003] *** __NSAutoreleaseNoPool(): Object 0x7fff701d7f70 of class NSCFString autoreleased with no pool in place - just leaking
2009-10-14 17:17:54.087 java[2010:10003] *** __NSAutoreleaseNoPool(): Object 0x100113330 of class NSCFString autoreleased with no pool in place - just leaking
2009-10-14 17:17:54.092 java[2010:10003] *** __NSAutoreleaseNoPool(): Object 0x101624540 of class NSCFData autoreleased with no pool in place - just leaking
.
.
.
我已经使用了-XstartOnFirstThread VM参数没有任何的运气。 我在64位可可,但我也试了32位可可。
当碳尝试,我得到了以下错误:
Invalid memory access of location 00000020 eip=9012337c
当进入调试Display类我可以看到显示[]数组只包含空引用。
我可以证实,我们成功地在Mac OS X上运行SWT 碳在其自己的事件循环拉开序幕由束激活,所以它是绝对有可能! 这是启动虚拟机时使用-XstartOnFirstThread。
但是 ,与可可SWT(64位),我看到了同样的错误:(
看来,虽然我们跑碳SWT的方式工作,它可能不是犹太:我们是通过另一个线程驱动事件循环,而不是主要的一个是你应该。 在可可SWT,这不工作了,这可能是不可靠的做法反正。
我可以在创建显示器(改编自可可SWT设备的构造函数)之前修复下列黑客线程池中的错误:
NSAutoreleasePool pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
NSThread nsthread = NSThread.currentThread();
NSMutableDictionary dictionary = nsthread.threadDictionary();
NSString key = NSString.stringWith("SWT_NSAutoreleasePool");
id obj = dictionary.objectForKey(key);
if (obj == null) {
NSNumber nsnumber = NSNumber.numberWithInteger(pool.id);
dictionary.setObject(nsnumber, key);
} else {
pool.release();
}
然而,随后挂起(即display.readAndDispatch()/display.sleep()舞)事件循环。 我怀疑它只是不读书,由于不是主线程UI事件。
我不知道是否有解决这个犹太方式。 在我的情况下,我们控制了主JVM线程启动OSGi的,所以我跟增加在那里的钩子,可以运行的OSGi推出后的SWT事件循环的想法玩弄。
我不得不说,只要“display.sleep()”被称为窗口冻结应用程序的问题。 如果别人HACE同样的问题,这对我工作的解决办法是添加:-XstartOnFirstThread到VM在执行的时刻。
我试图让我的Mac上槟榔备份软件工作,并知道它的工作:)
我的系统是:的MacOSX雪豹10.6.2
再见,丹尼尔W.
我有同样的问题,并通过添加这两种解决它-d32
和-XstartOnFirstThread
该代码看起来很奇怪...这应该是一个Eclipse插件? 你想做什么? 我猜你要创建一个用户界面的RCP插件。 如果是这样,这里的答案:不要做。 你OSGi的活化剂是不负责创建SWT显示事件循环。
建立在plugin.xml以声明的方式创建SWT引导的应用程序扩展。 它会是这个样子:
<extension
id="application"
point="org.eclipse.core.runtime.applications">
<application>
<run
class="com.yourcompany.foo.Application">
</run>
</application>
</extension>
然后创建应用程序类(调用任何你想要它)看起来是这样的:
public class Application implements IApplication {
/* (non-Javadoc)
* @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
*/
public Object start(IApplicationContext context) {
Display display = PlatformUI.createDisplay();
try {
int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
if (returnCode == PlatformUI.RETURN_RESTART) {
return IApplication.EXIT_RESTART;
}
return IApplication.EXIT_OK;
} finally {
display.dispose();
}
}
/* (non-Javadoc)
* @see org.eclipse.equinox.app.IApplication#stop()
*/
public void stop() {
final IWorkbench workbench = PlatformUI.getWorkbench();
if (workbench == null)
return;
final Display display = workbench.getDisplay();
display.syncExec(new Runnable() {
public void run() {
if (!display.isDisposed())
workbench.close();
}
});
}
}
显然,要确保你有SWT插件支持(org.eclipse.ui)在你的清单可同时作为运行。
我希望帮助。