2016-08-05 11 views
0

Ich verwende SWT in einem GUI-Hauptprogramm. Innerhalb davon erstelle ich einen anderen Thread, um einige Programme auszuführen. Wenn jedoch in diesen Prozessen einige Fehler auftreten, möchte ich dies dem Benutzer mitteilen, indem ich ein Meldungsfeld aufzeige. Da in SWT nur ein einzelner Thread GUI-Operationen ausführen kann, ließ ich den Programm-Runner Ausnahmen auslösen, so dass der GUI-Thread damit umgehen konnte. Ich habe jedoch Probleme, weil ich einen neuen Thread für den Programm-Runner erstelle (um den GUI-Thread nicht zu verzögern, der einige Grafiken ständig aktualisieren und aktualisieren wird), aber als Ergebnis bleiben die auftretenden Exceptions hängen als Teil dieses Threads, der das Fehlermeldungsfeld nicht erstellen kann. Irgendwelche Vorschläge, wie man damit umgehen soll? .SWT, mehrere Threads und Ausnahmen

private void goButtonActionPerformed() 
{ 
    // create the program runner object 
    ProgramRunner PR = new ProgramRunner(); // real code passes in data to be used 

    try{ 
     // check all necessary parameters are entered 
     boolean paramsOK = PR.checkParams(); 
     if (paramsOK) 
     { 
      // all necessary information is available. Start Processing. 
      Thread t = new Thread() { 
       public void run() 
       { 
        try{ 
         PR.runPrograms(); 
        } 
        catch (IOException iox) 
        { 
         // This does not work to catch & display the exceptions 
         // which took place in PR.runPrograms(), because this 
         // thread is not allowed to perform GUI operations. 
         // However, I don't know how to pass this 
         // exception/error notification out of this thread. 
         MessageBox mb = new MessageBox(m_Shell, SWT.ICON_ERROR); 
         mb.setMessage(iox.getMessage()); 
         mb.open(); 
        } 
       } 
      }; 
      t.start(); 
     } 
    } 
    catch (IOException iox) 
    { 
     // this works to catch & display the exceptions which took place 
     // in PR.checkParams() because that is not a separate thread 
     MessageBox mb = new MessageBox(m_Shell, SWT.ICON_ERROR); 
     mb.setMessage(iox.getMessage()); 
     mb.open(); 
    } 
+0

Ach ja, und ich realisiere, dass PR.checkParams() keinen Boolean zurückgeben muss, um überprüft zu werden, denn anstatt false zurückzugeben, hätte es einfach eine Exception geworfen, die hier behandelt wird. – sacrawford

Antwort

1

Wrap Fanglogik innerhalb eines Display.getDefault() asyncExec Fehlermeldungen auf UI-Thread angezeigt werden:

Thread t = new Thread() 
{ 
    public void run() 
    { 
     try 
     { 
      PR.runProgram(); 
     } 
     catch (final IOException iox) 
     { 
      Display.getDefault().asyncExec(new Runnable() 
      { 
       public void run() 
       { 
        MessageBox mb = new MessageBox(m_Shell, SWT.ICON_ERROR); 
        mb.setMessage(iox.getMessage()); 
        mb.open(); 

       } 
      }); 

     } 
    } 
}); 

t.start(); 

die Ausnahmen können dann in UI-Thread angezeigt werden.

0

Sie müssen veranlassen, dass der UI-Code im UI-Thread ausgeführt wird. Sie können dies unter Verwendung der asyncExec oder syncExec Methoden vontun.

syncExec unterbricht den aktuellen Thread, bis der UI-Code ausgeführt wurde. asyncExec unterbricht den Thread nicht und führt den UI-Code so schnell wie möglich aus.

Sie können die aktuelle Anzeige in jedem Thread bekommen mit Display.getDefault() so tun könnten Sie so etwas wie:

Display.getDefault().asyncExec(() -> 
{ 
    if (m_Shell != null && !m_Shell.isDisposed()) { 
    MessageBox mb = new MessageBox(m_Shell, SWT.ICON_ERROR); 
    mb.setMessage(iox.getMessage()); 
    mb.open(); 
    } 
}); 

ich eine Java 8 Lambda-Ausdruck für die Runnable hier verwendet haben, da sie kürzer als die traditionelle Methode ist.

Da dieser Code asynchron ausgeführt wird, sollten Sie prüfen, ob die Shell nicht null ist und nicht entsorgt wurde.