tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
1029
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    RipdEaTh RipdEaTh ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    36
    Hi Leute!

    Ich bin immernoch an meinem Thread-Problem dabei.
    Inzwischen hab ich das ganze als asyncThread laufen, klappt auch soweit.

    Allerdings hängt sich der Zähler immernoch manchmal auf. Das scheint damit zusammenzuhängen, dass die GUI nicht reagiert.

    Folgender Sachverhalt liegt vor:
    Ich hab ein Main-Programm. In diesem wird ein neues Fenster (shell) geöffnet, worin sich der Counter befindet.

    Das neue Fenster ist abhänging von dem Main-Fenster un das Main-Fenster wird deaktiviert, so dass man nicht zwischen beiden Fenstern hin und herspringen kann.
    Nun kommt aber öfters das Problem, dass sich die GUI aufhängt (erkennbar daran, dass die Menüleiste aus dem Main-Fenster weiß wird).
    Selbes Phänomen bekomme ich auch, wenn ich das Programm in den Hintergrund verlager (also z.B. Eclipse davor tue) und dann wieder in den Vordergrund hole.

    Wenn die GUI nicht mehr reagiert, kann ich zwischen beiden Fenstern wieder hinundher springen.
    Nun würde ich gerne wissen, ob mir da jemand helfen kann, das Problem einzugrenzen und vll damit dem eigentlichen Problem auf die Schliche zu kommen. Denn es kann doch nicht sein, dass die GUI nicht reagiert, wenn ein Thread läuft und die GUI eigentlich nichts mehr macht..

    Vielen Dank für Eure Hilfe
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Hast du Thread.start() oder Thread.run() benutzt? Du musst in jedem fall start() benutzen, sonst läuft es nicht als Thread. Das ist das was mir spontan einfallen würde.
     

  3. #3
    RipdEaTh RipdEaTh ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    36
    Hi,

    den Thread starten brauch man in dem Fall nicht.
    Das sieht wie folgt aus:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    display.asyncExec(new Runnable() {
     
        public void run() {
     
            // Instanziere einen weiteren Thread
            ThreadClass t = new ThreadClass(args);
            Thread x = new Thread(t);
     
            x.start();
     
            // Dann tu die GUI mit den Daten aus dem Thread aktualisieren
     
            while (!x.finish) {
                try {
                    Thread.sleep(200);
                } catch (InterruptException ie) {
                } finally {
                refreshGUI(t.integerwert);
                }
            }
        }
    }

    Also daran wirds nicht liegen..
     

  4. #4
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Uhjee kein Wunder. In einem sync oder asyncExec soll nur minimaler Code stehen.

    sync und async exec müssen nur benutzt werden wenn aus einem nicht GUI Thread auf ein SWT GUI Element zugegriffen werden soll. Da es nur den einen GUI Thread gibt sollte dieses Code Stück möglichst kurz sein, da der Rest der GUI so lange nicht aktualisiert werden kann wie dieser Code läuft (In deinem Beispiel so lange bis der inner Thread beendet ist).

    Komplizierte Berechnungen etc also möglichst vorher durchführen und ein asyncExec wirklich nur zum aktualisieren der GUI Elemente verwenden.

    Für dich heisst das also das asyncExec nur um refreshGUI(t.integerwert); herum zu haben und zwar innerhalb des Thread x bzw der ThreadClass t.

    Hoffe das war einigermaßen verständlich.
     

  5. #5
    RipdEaTh RipdEaTh ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    36
    Hi!

    Genau so hatte ich das vorher geregelt.. Genau der selbe Effekt.. Daraufhin hab ich das ganze mal in diese async Geschichte gebastelt.. Also das hat wohl kaum was damit zu tun..

    Sonst noch eine Idee?
     

  6. #6
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    So ist es auf jeden Fall falschrum.

    Was tut denn ThreadClass und refreshGUI?

    In jedem Fall ist diese while Schleife ein bisschen komisch. Diese läuft ja selbst nicht in nem Thread, also müsste sie dauerhaft ein Thread.sleep aufrufen. Da du sogar ausserhalb des x Thread bist und Thread.sleep den aktuell aktiven Thread schlafen legt, kann es passieren dass du damit den GUI Thread schlafen schickst.

    Am besten mal ein wenig debug ausgaben einbauen, dann solltest du sehen was wann aufgerufen wird. Im Falle einer InterruptException die GUI zu aktualisieren ist vielleicht auch nicht so geschickt. Denn eigentlich willst du ja nur dass das alle 200ms passiert.

    Würde empfehlen das Thread.sleep innerhalb des x Thread auszuführen und auch das refreshGUI in einem async exec gekapselt direkt dahinter auszuführen. Beides innerhalb einer while Schleife die wartet bis der Thread beendet wird. So mache ich das zumindest immer und habe auch keine Probleme gehabt, selbst wenn mehrere Threads liefen.
     

Ähnliche Themen

  1. VBA(!) Keine Rückmeldung umgehen
    Von dallas998 im Forum Visual Basic 6.0
    Antworten: 4
    Letzter Beitrag: 30.01.10, 11:24
  2. Performansproblem (Keine Rückmeldung)
    Von Don_Pazo im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 21.04.06, 14:22
  3. GUI gibt keine Rückmeldung
    Von cesupa im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 17.12.05, 08:43
  4. Bekomme keine Rückmeldung
    Von borsti im Forum Flash Plattform
    Antworten: 11
    Letzter Beitrag: 19.04.05, 15:17
  5. Keine Rückmeldung wenn in Schleife
    Von Frido im Forum VisualStudio & MFC
    Antworten: 5
    Letzter Beitrag: 25.01.05, 14:19