Nebenläufige Programmierung

Status
Nicht offen für weitere Antworten.
W

waste1

Gast
Hallo,
ich habe ein Problem mit Threads. Ich habe auch schon ein wenig hier rumgesucht, aber bin noch nicht fündig geworden. So hoffe ich, dass ihr mir weiterhelfen könnt.

Es wird einfach ein Textfeld und ein Button angezeigt.
In das Textfeld kann man hineinklicken, den Text markieren oder editieren. Soweit so gut. -> OK
Wenn man nun auf den Button klickt, soll im Textfeld der Text verändert und danach ein Thread gestartet werden. Das passiert auch. -> OK
Der Thread dauert 15 Sekunden. -> OK

nun mein Problem:
Während dieser Zeit (solange der Thread läuft) ist die Oberfläche nicht zu benutzen. Aber warum?
Warum blockiert der Thread den Rest? Oder besser, was mache ich genau falsch?
Ich dachte mit display.asyncExec(Thread) erreiche ich einen nebenläufigen Thread.

Ich hätte es gerne so, dass das Textfeld geändert wird, dann der Thread startet und während der Thread läuft sollte die Oberfläche weiter bedienbar sein. (hier also das Textfeld editierbar sein).

Hier mal der Beispielcode:

Code:
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class SWTThreadTest extends Thread
{
    private Thread t;
    private Text text;
    
    public static void main(String[] args)
    {
        new SWTThreadTest().start();
    }
    
    public void run()
    {
        final Display display = new Display();
        Shell shell = new Shell(display);

        text = new Text(shell, SWT.NONE);
        text.setText("Noch geht alles. Man kann in diesen Text klicken und ihn markieren");
        
        Button b = new Button(shell, SWT.PUSH);
        b.setText("Klick");
        b.addListener(SWT.Selection, new Listener() 
        {
            public void handleEvent(Event e) 
            {
                t = new Thread()
                {
                    public void run()
                    {                        
                        try
                        {
                            Thread.sleep(10000);
                        }
                        catch (InterruptedException e)
                        {
                            e.printStackTrace();
                        }                        
                        text.setText("Der Thread ist beendet, markieren geht wieder");
                    }
                };
                
                text.setText("Hier ist alles blockiert :( ");
                display.asyncExec(t);
            }
        });
        shell.setLayout(new RowLayout());
        shell.pack();
        shell.open();
        while (!shell.isDisposed()) 
        {
          if (!display.readAndDispatch()) 
            display.sleep();
        }
        display.dispose();
    }
}

Ich danke euch schonmal fürs Lesen und für eventuelle Lösungen.
Ich hoffe wirklich, dass ihr mir helfen könnt.

Gruß
waste1
 
B

Beni

Gast
"asyncExec" ruft die "run"-Methode innerhalb des Gui-Threads (wie auch immer der bei SWT heisst) auf. Du führst hier keinen eigenen Thread aus, sondern lässt einen anderen Thread deinen Code ausführen.

Starte den Thread mit "start()", das "asyncExec" benötigst du nur, um mit der Gui zu kommunizieren (Werte setzen oder lesen, ich geh mal davon aus, dass SWT sowenig threadsicher ist, wie AWT).
 
W

waste1

Gast
geht leider nicht, damit bekomme ich eine Exception:

Exception in thread "Thread-0" 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.Widget.checkWidget(Widget.java:331)
at org.eclipse.swt.widgets.Text.setText(Text.java:1648)
at swtThreadHangOn.SWTThreadTest$1$1.run(SWTThreadTest.java:46)



Deswegen bin ich ja eigentlich auch auf asyncExec gekommen...
Hast du sonst noch einen Tip? Oder Hinweis oder irgendwas, dass mich weiterbringt?

Wie löst ihr solche Probleme?
Eine Aufgabe dauert etwas länger, die GUI soll aber nicht hängenbleiben.
 
W

waste1

Gast
GUI beeinflussen ist ja grade das, was ich machen will/ machen muss.

Szenario:
Es gibt eine Tabelle in der GUI.
Die ist leer.
Mit einem Knopfdruck wird Inhalt berechnet, geholte, was auch immer.
Das holen des Inhaltes dauert etwas (sagen wir erstmal 10 Sek).
Der Inhalt soll in die Tabelle gefüllt werden, wenn er da ist.

Also dachte ich, alles mal initialisieren
Dann einen Thread machen, der den Inhalt holt und aufbereitet und wenn fertig in die Tabelle einträgt.

Wie soll ich das sonst machen?
 
B

Beni

Gast
Ich weiss ja nicht, was du jetzt getan hast, aber mein Tipp ist:
Beni hat gesagt.:
das "asyncExec" benötigst du nur, um mit der Gui zu kommunizieren

Code:
public void handleEvent(Event e)
            {
                t = new Thread()
                {
                    public void run()
                    {                       
                        try
                        {
                            Thread.sleep(10000);
                        }
                        catch (InterruptedException e)
                        {
                            e.printStackTrace();
                        }

// so würde das meinem Verständnis nach funktionieren
                        display.asyncExec( new Runnable(){
                            public void run(){
                                text.setText("Der Thread ist beendet, markieren geht wieder");
                            }
                        });
                    }
                };
               
                text.setText("Hier ist alles blockiert :( ");
                t.start();
            }
 
W

waste1

Gast
ahhh, Jetzt verstehe ich.
Dein Tip war genau das was ich suchte.
Supergroßes Danke für die Erleuchtung ;)

Auf einen Thread im Thread bin ich gar nicht gekommen, aber das mach genau das was ich will.
Nochmal Dankeschön für die Hilfe
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Swing Java Swing Gui und nebenläufige Threads AWT, Swing, JavaFX & SWT 4
I JList, AbstractListModel und nebenläufige Threads AWT, Swing, JavaFX & SWT 2
J GUI Programmierung Popup-Menü AWT, Swing, JavaFX & SWT 4
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
MiMa GUI Programmierung AWT, Swing, JavaFX & SWT 19
A GUI-Programmierung AWT, Swing, JavaFX & SWT 4
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
D Swing Swing und Programmierung auf Schnittstellen AWT, Swing, JavaFX & SWT 2
R GUI Programmierung AWT, Swing, JavaFX & SWT 3
M Tipps für Gui-Programmierung? AWT, Swing, JavaFX & SWT 9
H JOGL Programmierung - glRotatef() AWT, Swing, JavaFX & SWT 4
M GUI-Programmierung - GUI-Builder oder eigenständig? AWT, Swing, JavaFX & SWT 16
G Generelle Vorgehensweise Eventhandling bei GUI Programmierung AWT, Swing, JavaFX & SWT 14
H Struktur für Gui-Programmierung AWT, Swing, JavaFX & SWT 2
U java 6 Programmierung AWT, Swing, JavaFX & SWT 5
A Wecker-Programmierung mit GUI AWT, Swing, JavaFX & SWT 3
F JList und saubere Programmierung AWT, Swing, JavaFX & SWT 4
H Java Ascii Rechner Programmierung AWT, Swing, JavaFX & SWT 4
T Problem mit der Programmierung von Fenster und deren Inhalte AWT, Swing, JavaFX & SWT 4
N thread programmierung AWT, Swing, JavaFX & SWT 2
A grundsätzliches Vorgehen für GUI Programmierung AWT, Swing, JavaFX & SWT 6
M einfache Frage über SWT GUI-Programmierung AWT, Swing, JavaFX & SWT 3
S Richtiges Vorgehen bei GUI-Programmierung AWT, Swing, JavaFX & SWT 7
S GUI Programmierung AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen


Oben