[Java] Endlosschleifen in GUI

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von fragl0r, 4. August 2010 .

Schlagworte:
  1. 4. August 2010
    Endlosschleifen in GUI

    Hi Leute!!

    Ich hab mal wieder ein Problem...:

    Ich hab eine Gui mit nem Button. Der soll eine Variable in nem anderen Objekt wechseln. Wenn diese Variable == true ist, soll die ganze zeit eine Methode ausgeführt werden... Diese Methode macht weitere Objekte die auch Methoden haben, welche immer wieder aufgerufen werden sollen.

    Das Problem ist jetzt, wenn ich den Button drücke, startet meine Endlosschleife (while(variable == true)) und die Gui friert ein. Ich häng also in der Schleife und nix geht mehr. Ich hab das jetzt schon mit verschiedenen Threads versucht aber ich bleibe trotzdem immer hängen.

    Hab auf der Arbeit bisschen rumgefragt und die meinten man könne Methoden auch anders regelmäßig aufrufen ohne ne Endlosschleife zu basteln...

    Weiss einer was?
    fragl0r
     
  2. 4. August 2010
    AW: Endlosschleifen...

    ein thread müsste eigentlich die lösung deines problems sein.

    zeig doch mal ein bisschen source.
     
  3. 4. August 2010
    AW: Endlosschleifen...

    Das ist zB eine Klasse mit einer Schleife:

    Code:
    public class WindowsHandler extends Thread {
    
     PositionFenster PS;
     List<Fenster> listeDerFenster;
     boolean aktiv;
    
     public WindowsHandler() throws IOException, InterruptedException {
    
     listeDerFenster = new LinkedList<Fenster>();
     aktiv = false;
     PS = new PositionFenster();
    }
    
     public void GuiZuweisen(ArrayList<int[][]> positionen) throws IOException, InterruptedException {
    
     [...]
     }
    
     public void refresh() {
     for (Fenster f : listeDerFenster) {
     f.close();
     }
    
     }
    
     public void StartStop() {
     if (aktiv == false) {
     aktiv = true;
     } else {
     aktiv = false;
     }
     }
    
     public void scan() throws IOException, InterruptedException {
     GuiZuweisen(PS.findePositionen());
     if (aktiv == true) {
     //refresh();
     
     scan();
     
     }
    
    
     }
    }
    quasi wenn scan() einmal gestartet ist, soll es das so lange machen wie die Variable != true ist. Der Button löst StartStop() aus. Geht das so?

    fragl0r


    Edit: Hab gerade mal versucht die Variable direkt mit dem Button zu ändern, nicht mit einer Methode. Same Problem :/
     
  4. 4. August 2010
    AW: Endlosschleifen...

    du hast das thread konzept noch nicht ganz verstanden. da musst du nochmal die bücher wälzen ... run()
     
  5. 4. August 2010
    AW: Endlosschleifen...

    das hilft mir jetzt nicht weiter... hast denn ein Vorschlag wie man das ohne Threads löst?
     
  6. 4. August 2010
    AW: Endlosschleifen...

    Du musst die Scan-Methode in einen eigenen Thread verfrachten und kannst ihn dann per interrup wieder anhalten.

    Code:
    private Thread t;
    
     public void StartStop()
     {
     if (aktiv == false)
     {
     aktiv = true;
     t = new Thread(new Runnable()
     {
     @Override
     public void run()
     {
     scan();
     }
     });
     t.start();
    
     } else
     {
     aktiv = false;
     t.interrupt();
     }
     }
    
    Während scan() kannst du dann auf isInterrupted() testen und gegebenenfalls aufhören. Allerdings solltest du dich besser etwas in Threading einlesen, da sonst leicht fehler passieren, vor allem weil mein Beispiel jetzt sehr rudimentär geworden ist.

    // statt interrupt, kann man natürlich auch eine weniger "harte" Methode wählen, z.B. über eine gemeinsame Variable, die überprüft wird.
     
  7. 5. August 2010
    AW: Endlosschleifen...

    Hab mir gestern Abend doch mal was zu Threads durchgelesen und gemerkt das ich da ja totalen Blödsinn zusammengeschrieben hab...

    Ich lass den Thread trotzdem mal auf falls jemand n Tipp hat das ohne Threads zu lösen.


    greetz fragl0r
     
  8. 5. August 2010
    AW: Endlosschleifen...

    Hi,

    dass ohne Threads zu lösen wird nicht gehen. (behaupte ich einfach)
    denn wenn du ein Programm startest, dann ist dieses ja auch ein Thread.
    und das Programm wird von a nach b nach c abgearbeitet...
    erst wenn die eine methode fertig ist, wird die andere gestartet.

    threads sind super easy zu benutzen, find ich.

    erstell eine neue klasse, die dann der thread ist.
    überliefer dem thread ein objekt das die gewünschten variablen enthält
    also zB eine ArrayList oder ähnliches

    hier mal code (einfach wild hingeschrieben)
    Code:
    class MeinThread extends Thread {
    
     private ArrayList<int> zahlen;
     private boolean running;
    
     MeinTread(ArrayList<int> zahlen) {
     this.zahlen = zahlen;
     running = true;
     this.start(); 
     }
     @Override
     public void run() {
     while(running) {
     zahlen.add(2000);
     zahlen.add(1234);
     if (deine abbruch bedingung)
     running = false;
     }
     }
    }
    
    in run packste also eine schleife rein die was mit deinem objekt macht
    also das was du beim button drücken machen willst

    kA ob dir das hilft, hab deinen quellcode nur überflogen
    wie man am besten start und stp in nen thread baut findest du in der java doku

    edit:
    http://download.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

    hier, bisschen runterscrollen, bei "What should I use instead of Thread.suspend and Thread.resume?"
     
  9. 5. August 2010
    AW: Endlosschleifen...

    Hey!

    Im GTK+-Toolkit gibt es eine Funktion gtk_main_iteration_do (). Diese Funktion ist fuer solche Faelle konzipiert, da man bei der Endlos-Schleife dann einfach eine GUI-Iteration "einschieben" kann. Vielleicht findet sich in JAVA etwas aehnliches Mit Threads und GUI kombiniert hab ich uebrigens schlechte Erfahrungen gemacht.

    Mfg,

    Kolazomai
     
  10. 5. August 2010
    AW: Endlosschleifen...

    Swing und Threads gehören in Java untrennbar zusammen, denn fast alle Funktionen von GUI-Objekten müssen im Swing-Event-Dispatcher-Thread aufgerufen werden. Mir wäre auch nicht bekannt, dass es so etwas wie Kolazomai vorgeschlagen hat in Java gibt.

    Threading in Java ist wirklich nicht sehr schwer und sollte zum Handwerkszeug jeden Programmierers gehören. Daher bin ich der Meinung, dass dies die einzige vernünftige Lösung darstellt.
     
  11. 8. August 2010
    AW: Endlosschleifen...

    Hi Leute!

    Also, hab jetzt ein wenig mit den Threads rumgemacht und festgestllt das die Gui immer noch einfriert.

    Also:

    Code:
    public static void main(String [ ] args)
    [COLOR=blue][COLOR=Black]{
     Endlosschleife ES = new Endlosschleife();
     Gui gui = new Gui(ES);
    }[/COLOR][/COLOR]
    Code:
    Class Endlosschleife extends Thread{
    [COLOR=blue][COLOR=Black] 
    [...]
    
    @override
    public void run(){
    
     While(true){
     doSomething();
     }
    }[/COLOR][/COLOR]

    So, die gui ist nix weiteres als ein JFrame/JWindow mit nem Button drin, der am Objekt Endlosschleife die run() Methode startet. Wenn ich das mache friert sie aber einfach ein.
    Was mach ich falsch?

    greetz fragl0r
     
  12. 8. August 2010
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Endlosschleifen in GUI

    Hallo,
    ich habe dir hier: klick ein Beispiel programmiert. Dieses Beispiel ist eine GUI bei der man mit Hilfe eines Button einen Thread im Hintergrund startet. Dabei Friert die GUI NICHT ein. Ich habe den Code an den markanten Stellen kommentiert. Solltest du noch Fragen haben melde dich, ich hoffe das ist vom Prinzip her was du dir vorgestellt hast.

    Hier noch ein kleiner Codeausschnitt für all diejenigen die nicht gleich das ganze Projekt laden wollen.

    Code:
    public class MyThread implements Runnable{
     private int counter = 0; //Zaehlattribut
     private NewJFrame frameReferenz;
    
     //Der Thread benoetigt eine Referenz
     public void setFrameReferenz(NewJFrame jf){
     frameReferenz = jf;
     }
    
     public void run() {
     while(true){
     count();
     try {
     //Den Thread 500ms Schlafen lassen (wegen Prozessorauslastung)
     Thread.sleep(500);
     } catch (Exception ex) {
    
     }
     }
     }
    
     public void count(){
     //Wenn die CheckBox in der Gui ein gesetztes haeckchen hat
     if(frameReferenz.isSelectedJCheckBox1() == true){
     counter++; //Zaehlen
     frameReferenz.appendTextArea(String.valueOf(counter)); //Die Zahl in der Textarea anzeigen, um zu zeigen das die GUI nicht einfriert
     }else{
     //Sonst nichts machen
     }
     }
    
    }
    
    Ps.: Das Beispiel ist in Netbeans 6.9 programmiert.

    Greez Mever
     
  13. 9. August 2010
    AW: Endlosschleifen...

    Ich weiß ja nicht, ob du vllt. noch etwas anderes falsch gemacht hast, aber für Threads nie-nie-niemals die run()-Methode aufrufen. Denn in diesem Fall läuft das ganze nicht als Thread sondern als normale Funktion und blockiert daher natürlich. Stattdessen muss Thread#start() aufgerufen werden.
     
  14. 11. August 2010
    AW: Endlosschleifen in GUI

    Job, das war unter anderen ein Fehler den ich gemacht hab. Die scheiss Gui friert immer noch ein -.- Aber ich bastel erstmal selbst rum und komm dann mit konkreten Fragen, falls es dann immer noch nicht klappt
     
  15. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.