2010-08-02 3 views
1

코드를 실행하려고 할 때 "잘못된 스레드 액세스"라는 SWTException이 계속 나타납니다. 내가 읽고 문제가 UI 스레드 외부에서 SWT 개체에 액세스하려고 코드가있을 것 같습니다. 특히 테이블 위젯이 있고 선택 리스너가 추가되었습니다. 다음은 선택 수신기의 코드입니다. 그것을 포장하여표준 위젯 툴킷에서 UI 스레드와 코드를 동기화하는 방법

public void createChat(final XMPPConnection connection,final SelectionEvent event) 
{ 
    Display.getDefault().syncExec(new Runnable()   
    { 
     public void run() 
     { 
      String s = event.item.toString(); 
      int length = event.item.toString().length(); 
      ClassView cv = new ClassView(connection,s.substring(11,length -1),null); 
     } 
    }); 

당신은 내가 너무 UI 스레드 외부에있는 코드를 동기화 시도했습니다 볼 수 있듯이, UI 스레드와 :

rosterTable.addSelectionListener(new SelectionAdapter() 

    { 
     public void widgetSelected(final SelectionEvent event) 
     { 

       createChat(connection,event); 


     } 

      }); 

여기가 createChat 방법에 대한 코드입니다 syncExec 메서드에서하지만 여전히 테이블 항목을 선택했을 때 예외가 발생합니다.이 예외가 발생하면 syncExec 부분을 잘못된 위치에 넣었습니다.

또한 createChat 메서드에서 인스턴스화 된 ClassView 개체가 SWT 위젯을 사용한다는 사실 때문에 문제가 발생할 수 있다고 생각하지만 확실하지 않습니다.

누구든지 syncExec 코드가 있어야하는 위치를 알고 있습니까?

아니면 완전히 잘못하고있는 경우 어떻게 해결할 수 있습니까?

업데이트 :

나는 지금, 나는 그것을해야한다 생각하지 않는다 조금 다른 외모 때문에, 내가 코드에 대한 재 설계의 조금 한 일을 당신이 말한 불행하게도 나는 여전히 예외를 받고 있어요했다

rosterTable.addSelectionListener(new SelectionAdapter() 

    { 
     public void widgetSelected(final SelectionEvent event) 
     { 

      selectedUser = event.item.toString(); 
      System.out.println(selectedUser); 
      rm.createChat(selectedUser); 

     } 






    }); 

여기에 지금 다른 클래스에있는 메서드에 대한 코드입니다 : 어떤 차이가 있지만 단지의 경우 여기에 다시 청취자에 대한 코드의

public void createChat(String item) 
{ 
    int length = item.length(); 
    Chatter c = new Chatter(connection,item.substring(11,length-1)); 

} 

그녀의

org.eclipse.swt.SWTException: Invalid thread access 
at org.eclipse.swt.SWT.error(SWT.java:3884) 
at org.eclipse.swt.SWT.error(SWT.java:3799) 
at org.eclipse.swt.SWT.error(SWT.java:3770) 
at org.eclipse.swt.widgets.Display.checkDisplay(Display.java:721) 
at org.eclipse.swt.widgets.Display.create(Display.java:783) 
at org.eclipse.swt.graphics.Device.<init>(Device.java:135) 
at org.eclipse.swt.widgets.Display.<init>(Display.java:454) 
at org.eclipse.swt.widgets.Display.<init>(Display.java:445) 
at instantmessengerplugin.ClassView.<init>(ClassView.java:33) 
at instantmessengerplugin.Chatter.<init>(Chatter.java:20) 
at instantmessengerplugin.RosterManager.createChat(RosterManager.java:48) 
at instantmessengerplugin.RosterView$1.widgetSelected(RosterView.java:103) 
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:228) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003) 
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3880) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3473) 
at instantmessengerplugin.RosterView.<init>(RosterView.java:158) 
at instantmessengerplugin.Connection.connect(Connection.java:110) 
at instantmessengerplugin.Connection$1.widgetSelected(Connection.java:65) 
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:228) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003) 
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3880) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3473) 
at instantmessengerplugin.Connection.<init>(Connection.java:77) 
at instantmessengerplugin.Connection.main(Connection.java:119) 

답변

0

문제가 해결되었습니다. 예외는 ClassView에서 SWT Display 클래스의 인스턴스를 만들려고했는데, 이미 인스턴스가 존재할 때 예외가 발생했습니다. 플랫폼은 한 번에 하나만 열 수 있습니다.

하나의 디스플레이 만 사용되고 예외는 사라지도록 코드를 변경했습니다.

도움 주셔서 감사합니다.

0

당신은 확실히 문제가 UI 스레드 내에서 syncExec()를 호출 : 전자는 예외 스택 추적입니다.

모든 SWT 이벤트가 UIThread에서 실행되므로 widgetSelected()에서 createChat()을 호출하면 이미 UIThread에 있습니다. createChat()에서 문제가 발생한 UIThread를 다시 차단하려고합니다.

syncExec()으로 전화를 걸어보고 무슨 일이 일어나고 있는지 다시보고하십시오. 예외가 계속 발생하면 스택 추적을 포함하십시오.

간단한 SWT 프로그램을 만드는 경우 일반적으로 대부분의 간단한 응용 프로그램이 이벤트에 반응하여 UI 스레드에서 비즈니스 논리를 처리하므로 UI ​​스레드에 대해 걱정할 필요가 없습니다. UI 스레드를 생성 할 때 UI 스레드에 대해 걱정해야합니다 (또는 백그라운드에서 쓰레드를 처리하는 java.util.concurrent를 사용하여).

+0

스택 추적을 포함하여 질문을 업데이트했습니다. – Joshy910

+0

createChat() 코드를 보았지만 stacktrace에 따라 Chatter의 생성자에서 호출되는 ClassView 생성자에서 실제로 예외가 발생합니다. 이 두 클래스에 관련 코드를 게시 할 수 있습니까? 우리는 이것을 아직 추적하지 않을 것이다. – rancidfishbreath

관련 문제