2016-08-08 4 views
0

Ich kann meine Benutzeroberfläche auch nicht aktualisieren, nachdem alle SWT-Code in "Display.getDefault().asyncExec" verpackt wurden.Display.getDefault(). AsyncExec gibt InvocationTargetException

Angenommen, ich habe einen Zuhörer, der auf eine Taste klicken soll.

Listener enterlisner = new Listener() { 
    @Override 
     public void handleEvent(Event event) 
     { 
      Display.getDefault().asyncExec(new Runnable() 
      { 
       public void run() 
       { 
        try 
        { 
         if((event.keyCode == SWT.CR || event.keyCode == 13 || event.type == SWT.Selection) && btnAdd.isEnabled()) 
         { 
          new ProgressMonitorDialog(shell).run(true, true, new IRunnableWithProgress() 
          { 
           @Override 
           public void run(final IProgressMonitor monitor) throws InvocationTargetException, 
             InterruptedException 
           { 

              // method1() 

              // method2() {method2.1() , method2.2()} 

              // method3() {method3.1() , method3.2()} 

              // .... 

              // ... 

              // method10 

           } 
          }); 
         } 
        } 
        catch (InvocationTargetException | InterruptedException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } 
}; 

Könnte jemand bitte verweisen link denken und lassen Sie mich wissen, wo ich falsch bin?

Wie verzweigen Sie Stück von Methoden, die in einem Hintergrundthread ausgeführt wird?

+0

Sie müssen uns ein minimales Beispiel für Ihren Code zu erhalten und die genaue Nachricht, die Sie bekommen. –

+0

Hallo Greg. Sie können oben auf den Link klicken, wo ich den gesamten Code geschrieben habe –

+0

Es gibt zu viel Code dort und es sagt nicht klar, was die InvocationTargetException ist. Wir brauchen einen [MCVE]. Aber alles in asyncExec zu umgeben ist mit ziemlicher Sicherheit falsch. –

Antwort

2

Wrapping den gesamten Code in asyncExec, wenn Sie bereits im UI-Thread im Wesentlichen nichts erreicht (außer für einige sehr spezialisierte Anwendungen).

Sie müssen sich Ihren Code ansehen und jedes Stück identifizieren, das in einem Hintergrundthread ausgeführt wird. Jeder Zugriff auf UI-Vorgänge an diesen Orten muss zu diesem Zeitpunkt einen Aufruf asyncExec (oder syncExec) verwenden.

Die IRunnableWithProgress, die Sie an ProgressMonitorDialog übergeben, wird in einem Hintergrundthread ausgeführt. Jedes Mal, wenn Sie auf ein Benutzeroberflächenobjekt im Code IRunnableWithProgress zugreifen, müssen Sie einen separaten Aufruf asyncExec oder syncExec aufrufen.

So etwas wie:

Listener enterlisner = new Listener() { 
    @Override 
    public void handleEvent(Event event) 
    { 
    if ((event.keyCode == SWT.CR || event.keyCode == 13 || event.type == SWT.Selection) && btnAdd.isEnabled()) 
    { 
     new ProgressMonitorDialog(shell).run(true, true, new IRunnableWithProgress() 
     { 
      @Override 
      public void run(final IProgressMonitor monitor) throws IvocationTargetException, InterruptedException 
      { 
       ... code not using UI 

       Display.getDefault().asyncExec(... code using UI ....); 

       ... more code not using UI 

       Display.getDefault().asyncExec(... more code using UI ....); 
      } 
     } 
    } 
    } 
+0

Aber was ist, wenn ich eine Mischung aus Code habe, der die Benutzeroberfläche aktualisiert und die Benutzeroberfläche nicht aktualisiert? Soll es in mehrere asyncExec() -Methoden eingebunden werden? –

+0

Ja, mehrere asyncExec- oder syncExec-Aufrufe. Bearbeitet das Beispiel, um dies zu zeigen –

+0

Display.getDefault() zu halten. AsyncExec() aus "new ProgressMonitorDialog (shell)" zeigen den Fortschritt bewegt, aber während ProgressMonitorDialog() zeigt nicht –

Verwandte Themen