SWT: org.eclipse.swt.SWTException + Thread

  • Themenstarter Themenstarter Aimee
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
A

Aimee

Gast
Hallo,

nun habe ich die Suche gequält aber mir ist immer noch nicht klar was ich falsch mache..

Ich minimiere mal meine Anwendung so weit das ich in kurzen Worten beschreiben kann was ich vor habe.

Und zwar habe ich einen Dialog der eine Tabelle mit Kategorien enthält. "Kategorie1, Kategorie2 ..."
Wenn ich auf einen Button namens "starten" drücke dann werden die Kategorien abgearbeitet und dort wo er gerade ist erscheint ein Pfeil neben der Zeile der Kategorie.

Für das aktualisieren des Dialoges verwende ich einen Thread der ungefähr so ausschaut.
Code:
     public Integer startDialog(List array)
    {
           // Aufruf der GUI
          return integer;
    }


// in der GUI wird Button "starten" gedrückt und ruft nun Funktionsname() auf:
Main.Funktionsname();

// Start
public static void Funktionsname() {
     new Thread()
        {
            public void run()
            {              
                // Vorarbeit 
                
                // l ist Liste der Kategorien
                for (int i = 0; i < l.size(); i++)
                {            
        
                        Boolean bool = // Funktion die die Kategorien bearbeitet liefert einen Wert zurück ob es durch lief
                        if (!bool)
                        {
                            break;
                        }
                        else
                        {
                            // refreshen des Pfeils der an entsprechende Kategorie wandert
                        }
                    
                }
            }
        }.start();
}

Mein Problem ist nun das wenn ich einmal durch bin und noch einmal auf den Button klicke weil ich es noch einmal durch laufen lassen möchte dann bekomme ich folgende Fehlermeldung:
Exception in thread "Thread-2" org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:3374)
at org.eclipse.swt.SWT.error(SWT.java:3297)
at org.eclipse.swt.SWT.error(SWT.java:3268)
at org.eclipse.swt.widgets.Widget.error(Widget.java:435)
at org.eclipse.swt.widgets.Shell.<init>(Shell.java:271)
at org.eclipse.swt.widgets.Shell.<init>(Shell.java:262)
at org.eclipse.swt.widgets.Shell.<init>(Shell.java:215)

Ich hab zwar eine Menge Ideen aber nichts hilft mir weiter..

Vielen Dank für Anregungen!
:bahnhof:
 
Du darfst dich aus anderen Threads nicht in den SWT-Thread einmischen.
Das ist also wie bei Swing, nur das hier konsequenterweise gleich eine Exception fliegt.
Verwende Display.asynchExec analog zu SwingUtilities.invokeLater
 
das ist jetzt aber eigenartig.

Ich bin auf diesen Forenbeitrag gestoßen durch eine google-Suche nach "SWT Threads", um herauszufinden, wie man in SWT GUI-Zugriffe aus Worker-Threads regelt.

Nachdem ich dann hier das mit Display.asynchExec gelesen hatte, habe ich, um nähere Details darüber zu erfahren, nach "SWT Display.asynchExec" gegoogelt.

Und - diese Google-Suche ergab nur einen einzigen Treffer, und zwar genau diese Seite hier! WTF??? Es sollte sich doch dabei um eine recht häufig anzutreffende Thematik handeln, oder? Wieso gibt es dann im gesamten Internet sonst keine Treffer dazu?
 
Gast hat gesagt.:
Wieso gibt es dann im gesamten Internet sonst keine Treffer dazu?
Weil ich der einzige bin der die Antwort kennt und ich veröffentliche sie exklusiv hier.
Ist doch großzügig von mir, findest du nicht? 😀
 
Daran muss man sich bei SWT gewöhnen, dass man zu vielen Problemen nicht so einfach über Google die Lösung findet. In diesem Fall wäre aber ein Blick in die API hilfreich gewesen unter Display.aSyncExec().

Im Übrigen: Die Suchanfrage ist etwas unglücklich, weil sie ja die Antwort auf die Frage, wie man mit SWT von mehreren Threads auf die Widgets zugreift, schon beinhaltet. Wenn Du nach "SWT Threads" suchst, dann findest Du schon mehr. 😉
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben