#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 + Multi-Zitat Zitieren
#2 4. August 2010 AW: Endlosschleifen... ein thread müsste eigentlich die lösung deines problems sein. zeig doch mal ein bisschen source. + Multi-Zitat Zitieren
#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 :/ + Multi-Zitat Zitieren
#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() + Multi-Zitat Zitieren
#5 4. August 2010 AW: Endlosschleifen... das hilft mir jetzt nicht weiter... hast denn ein Vorschlag wie man das ohne Threads löst? + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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?" + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#14 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. + Multi-Zitat Zitieren
#15 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 + Multi-Zitat Zitieren