2009-10-14 4 views
6

Mac OS X Snow Leopard를 실행 중이며 OSGi 번들의 활성화 프로그램에서 디스플레이에 액세스하지 않으려 고합니다. 다음은 Mac OS X에서 SWT 디스플레이를 가져올 수 없습니다

내 활성의 시작 방법 :

@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 환경에서이 코드를 호출 작동 잘하지만, 맥 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 비트 코코아를 사용해 보았습니다.

탄소에 노력하고 나는 다음과 같은 오류 얻을 : Display 클래스로 디버깅 할 때

 
Invalid memory access of location 00000020 eip=9c 

I이 표시 [] 배열은 널 (null) 참조가 포함되어 있음을 알 수있다.

+0

을 모두 추가하여 해결했습니다. Windows에서 작동합니까? 정말? 나는 그것을 시도해야 할 것이다 ... – andyczerwonka

답변

2

SWT Carbon가 번들 정품 인증으로 시작된 자체 이벤트 루프에서 Mac OS X에서 성공적으로 실행되었음을 확인할 수 있습니다. 이것은 VM을 시작할 때 -XstartOnFirstThread를 사용합니다.

그러나는, 코코아 SWT (64 비트)로, 저도 같은 오류 :(

우리가 탄소 SWT를 실행하는 방식이 작동하지만, 아마 정결하지 않았다 것 같다 참조 : 우리는 운전했다 이벤트 루프를 다른 스레드를 통해 당신이 해야하는 주요 하나. 코코아 SWT 아래에 더 이상 작동하지 않으며 어쨌든 아마 dodgy 연습이었다.

스레드 풀 오류를 해결할 수 있습니다. (Cocoa SWT Device 생성자에서 변형 된) 디스플레이를 만들기 전에 다음과 같은 해킹을 시도하십시오.

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 이벤트를 읽지 않는 것으로 의심한다.

이 문제를 해결할 정식 방법이 있는지 확실하지 않습니다. 필자의 경우에는 OSGi를 시작하는 기본 JVM 스레드를 제어하므로 OSGi가 시작된 후 SWT 이벤트 루프를 실행할 수있는 훅을 추가하는 아이디어를 가지고 놀고 있습니다.

+0

간단한 코드를 작성하여 실행하는 것이 가능합니까? 그리고 작동 시작 구성? –

+0

내 질문을 올바르게 이해했습니다. 마지막 코멘트는 SWT 이벤트 루프를 실행하기 위해 후크를 추가하려는 것입니다. Display 클래스에서 지원한다고 생각합니다. 일단 주 스레드에서 첫 번째 인스턴스를 생성하면 정적 메서드가 예상대로 작동합니다. 적어도 당신이 문서를 믿는다면. 내 이해에서 당신은 SWT 이벤트 스레드에서 코드를 실행하기 위해 Display.asyncExec (..)을 호출 할 수 있습니다 ... Eclipse에서 최소한 그렇게하는 방법입니다. –

+0

메인 스레드에서 디스플레이 인스턴스를 만드는 것이 까다로운 부분입니다! 우리는 OSGi 프레임 워크를 시작하는 일반적인 "부트 스트랩"클래스를 사용합니다. 실제로 SWT 번들에 의해 나중에로드되기 때문에 SWT 또는 심지어 클래스에 대한 액세스가 전혀 없습니다. 제 아이디어는 부트 스트랩 코드에 일종의 일반적인 훅을 추가하는 것입니다.이 훅은 SWT 번들이 루프를 주 스레드에 의해 실행시키는 데 사용할 것입니다. 그 트릭은 이것을 깨끗하게하는 것입니다 ... –

0

이 코드는 매우 이상하게 보입니다 ...이 플러그인이 이클립스 플러그인이되어야합니까? 너 뭐하려고? 사용자 인터페이스를 사용하여 RCP 플러그인을 만들려고합니다. 그렇다면 대답은 다음과 같습니다.하지 마십시오. OSGi Activator는 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 플러그인 (조직이 있는지 확인하십시오. eclipse.ui)를 사용할 수 있습니다.

도움이 되었기를 바랍니다.

+1

아니, 이클립스 플러그인을 만들려고하지 않고있다. Eclipse RCP없이 OSGi 환경에서 SWT를 사용하려고합니다. RCP의 Workbench는 Display 생성에 대한 책임이 있으며 모든 플러그인이 활성화되기 전에 Main Thread에서 수행된다는 것을 알고 있습니다. AFAIK 후에는 UI 스레드로 사용되는 한 모든 스레드에서 디스플레이를 만들 수 있어야합니다. doc : "SWT에서 Display 인스턴스를 만드는 스레드는 해당 디스플레이의 사용자 인터페이스 스레드로 구별됩니다." –

+0

그러나 맥 오에스텐이 쓰레드가 쓰레드 0이되어야한다는 것을 알았습니다. 왜 그것이 윈도우에서는 작동하지만 Mac에서는 작동하지 않는지 설명 할 수 있습니다. 그래도 어떻게 해결해야할지 모르겠다. –

+0

RCP없이 SWT를 원하지만 OSGi를 원한다. 이상하게 보인다. RCP는 기본적으로 SWT 및 OSGi이며, 원하지 않는 경우 사용할 필요가없는 몇 가지 플러그인이 추가로 포함되어 있습니다. – andyczerwonka

1

"display.sleep()"를 호출하자마자 Window가 응용 프로그램을 고정 시켰습니다. 다른 사람이 같은 문제를 해결하면 저에게 도움이되는 해결책은 실행 시점에 -XstartOnFirstThread 을 VM에 추가하는 것입니다.

나는 그것의 작동 :)

내 시스템 내 Mac에서 아레카 백업 소프트웨어 작품을 만들려고 노력하고 알고되었다 :에서라도 스노우 레오파드 10.6.2

안녕을 다니엘 W.

1

나는 동일한 문제가있어서 -d32-XstartOnFirstThread

관련 문제