在Mac OS X无法获得SWT显示(Can't get SWT Display on Ma

2019-08-18 02:16发布

我在运行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类我可以看到显示[]数组只包含空引用。

Answer 1:

我可以证实,我们成功地在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事件循环的想法玩弄。



Answer 2:

我不得不说,只要“display.sleep()”被称为窗口冻结应用程序的问题。 如果别人HACE同样的问题,这对我工作的解决办法是添加:-XstartOnFirstThread到VM在执行的时刻。

我试图让我的Mac上槟榔备份软件工作,并知道它的工作:)

我的系统是:的MacOSX雪豹10.6.2

再见,丹尼尔W.



Answer 3:

我有同样的问题,并通过添加这两种解决它-d32-XstartOnFirstThread



Answer 4:

该代码看起来很奇怪...这应该是一个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)在你的清单可同时作为运行。

我希望帮助。



文章来源: Can't get SWT Display on Mac OS X