Schleife mit leerem Anweisungsblock wird trotz erfüllter Bedingung nicht verlassen

chaostheory

Bekanntes Mitglied
Hallo,
ich schreibe gerade ein 2D-Spiel, bei dem zunächst nur ein leerer Bildschirm angezeigt wird und der user aufgefordert wird, die Enter-Taste zu drücken. Während mein KeyListener also schön wartet, lasse ich die Hauptklasse mit dieser Methode warten:
Java:
while(!running){}
Wenn dann allerdings Enter gedrückt wird, wird die Schleife nicht verlassen, obwohl die Variable korrekt auf true gestellt wurde. Schreibe ich irgendeine Anweisung in den Block funktioniert es.
Ist es nicht möglich die Schleife leer zu lassen?
 
I

irgendjemand

Gast
das problem ist das auf grund des leeren loop-body die schleife so unheimlich schnell läuft *und auch extrem den cpu belastet* das das system einfach nicht mehr zum checken der bedingung kommt ...
baue einfach mal ein [c]Thread.sleep(100);[/c] ein ... das sollte das problem lösen ... nebenbei dürfte deine cpu-last auch deutlich nach unten sinken ...
 
G

Gast2

Gast
Mir erschließt der Sinn deiner Dauerschleife nicht.
Wenn der User Enter drückt kannst du doch explizit ne Methode anstoßen.
 

Marco13

Top Contributor
Wenn man 'running' als
private volatile boolean running = ...
deklariert, geht es zwar, aber es ist trotzdem noch Unfug. Da gehört mindestens ein 'Thread.sleep(...)' rein, vermutlich sogar eher ein wait() und an anderer Stelle das passende notifyAll()...
 

chaostheory

Bekanntes Mitglied
Mir erschließt der Sinn deiner Dauerschleife nicht.
Wenn der User Enter drückt kannst du doch explizit ne Methode anstoßen.

Ja, stimmt auch. Allerdings würde so bei jedem Enter ein neues Spiel gestartet, es sei denn ich benutze wieder eine boolesche Variable.

Vor allem aber stammt der Code aus meiner main-Methode und würde ich die nicht bis zum Ende laufen lassen, wäre das Programm doch sofort vorbei!?
 

chaostheory

Bekanntes Mitglied
Wenn ich den Thread in der Schleife jedes Mal 100 Millisekunden warten lasse, funktioniert es wunderbar. Notify wäre hier nicht so gut, weil mein KeyListener ja keine Berechtigung hat die Main-Klasse aufzuwecken.

Hier noch mal etwas mehr Code, aber falls es nichts Besseres als wait() gibt hat es sich erledigt, denn das klappt auch gut.

KeyHandler:
Java:
public void keyPressed(KeyEvent event) {
		int keyCode = event.getKeyCode();
		
		switch(keyCode) {		
			case KeyEvent.VK_ESCAPE :	main.setRunning(false);												break;
			case KeyEvent.VK_RIGHT :	main.getPlayerList().get(0).setDirection(Player.Direction.RIGHT);	break;
			case KeyEvent.VK_LEFT :		main.getPlayerList().get(0).setDirection(Player.Direction.LEFT);	break;
			case KeyEvent.VK_ENTER :	main.setRunning(true);												break;
		}
		
		event.consume();
	}

Und dann die Methode run(), die von der main-Methode aufgerufen wird und bisher das ganze Spiel durchläfut:

Java:
//Main method called from main
	public void run() {	
		init();

		printStart();
		
		//Do nothing until game starts
		while(!running){
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {}
		}
		
		try{
			movieLoop();
		}finally{
			screenManager.restoreScreen();
		}
	}
 
G

Gast2

Gast
init() und printStart() haben da mMn nicht drin verloren. Die solltest du woanders parken.

In deinem EventListener startest du dann einfach den Thread und es kann losgehen.
 

hdi

Top Contributor
Java:
        while(!running){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {}
        }

Dieser Anstatz ist nicht grad das gelbe vom Ei. So kann es jetzt beim Starten des Spiels zu einer Verzögerung bis 100ms kommen. Aber den sleep-Wert runterdrehen ist auch keine Lösung, denn je kleiner der wird, desto mehr bewegst du dich in Richtung "busy waiting" - auch schlecht.

Wie schon gesagt wurde solltest du über wait() und notify() gehen. Stichwort Synchronisation. Damit musst du dich eh beschäftigen, da dein Code buggy ist. Sofern running nämlich nicht als volatile deklariert wurde kann es sein dass du ewig in dieser Schleife hängst - auch nachdem running auf true gesetzt wurde! Der Fall tritt u.U. so gut wie nie ein, kommt drauf an was du sonst so für Anweisungen in deinem Code hast. Aber theoretisch kann es sein dass dein Spiel NIE startet.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Verschachtelte For-Schleife gibt falschen Wert zurück, Abbruchbedingung evtl. falsch? Allgemeine Java-Themen 9
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
MangoTango Operatoren while-Schleife für Potenz Allgemeine Java-Themen 3
berserkerdq2 Wie synchronisiere ich eine for-Schleife Allgemeine Java-Themen 12
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
A For-Schleife Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
1 Klassen Variabel aus Schleife übergeben Allgemeine Java-Themen 8
D "Automatisierte", variable verschachtele for-Schleife Allgemeine Java-Themen 9
F Schleife funktioniert nicht richtig Allgemeine Java-Themen 13
K For-Schleife <> oder != Operator verwenden? Allgemeine Java-Themen 2
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
D While-Schleife - if Zweig unterbrechen Allgemeine Java-Themen 1
F Zweifache For-Schleife Allgemeine Java-Themen 6
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
M While-Schleife schneller, solange die Abbruchbedingung nicht vom Schleifeninneren abhängt Allgemeine Java-Themen 3
S Variablen String[] Array per schleife in int[] einlesen Allgemeine Java-Themen 8
D Methoden Buttons erscheinen doppelt nach Wiederholung in Schleife Allgemeine Java-Themen 1
RalleYTN Problem bei Schleife die durch einen 2D raum iterieren soll Allgemeine Java-Themen 1
T for - Schleife Allgemeine Java-Themen 1
J While Schleife ausführen bis Zahl = X Allgemeine Java-Themen 19
R Komplizierte Schleife Allgemeine Java-Themen 1
Q For-Schleife in String-Value Allgemeine Java-Themen 3
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F for-Schleife auf Kommandoebene ausgeben Allgemeine Java-Themen 9
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
P Erweiterte For Schleife Allgemeine Java-Themen 7
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
Y automatisierte for Schleife Allgemeine Java-Themen 13
B For schleife und weiter? Allgemeine Java-Themen 8
D Probleme bei for-Schleife Allgemeine Java-Themen 4
L einfache Verzinsung mit for-Schleife & Ausschluss von Werten beim Einlesen Allgemeine Java-Themen 5
N Frage zur while-Schleife Allgemeine Java-Themen 18
M for Schleife mit Swing Button abbrechen Allgemeine Java-Themen 7
M PdfPTable per for-Schleife befüllen Allgemeine Java-Themen 3
F for-Schleife mit : Allgemeine Java-Themen 5
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
W Problem mit Index in einer for-Schleife Allgemeine Java-Themen 8
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
P Variablen Auf durch for-Schleife generierte JComboBox zugreifen Allgemeine Java-Themen 3
G while Schleife ausführen solange eine Taste gedrückt ist Allgemeine Java-Themen 14
F Foreach und for - Schleife Allgemeine Java-Themen 10
W Berechnung Durchschnitt mit Schleife Allgemeine Java-Themen 9
S for-Schleife, while-Schleife Problem Allgemeine Java-Themen 6
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
A java.lang.NullPointerException bei Schleife Allgemeine Java-Themen 3
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
R while schleife auf 3 durchgänge beschränken Allgemeine Java-Themen 6
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
x22 for-Schleife Allgemeine Java-Themen 76
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
J Schleife mit : Allgemeine Java-Themen 18
S Klassen in einer Schleife durchlaufen Allgemeine Java-Themen 11
E Schleife wird nicht ausgeführt!!! Allgemeine Java-Themen 8
S Do-While Schleife bricht nicht ab Allgemeine Java-Themen 3
S Erste Schritte if-Anweisung in for- oder while-schleife umwandeln Allgemeine Java-Themen 3
K CheckBox schleife Allgemeine Java-Themen 2
D Methoden Thread Schleife Status Allgemeine Java-Themen 7
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
R In einer for Schleife bei einem Substring anfangen, wo man davor aufgehört hat Allgemeine Java-Themen 6
T Rekursion mit While Schleife kombinieren? Allgemeine Java-Themen 4
D Sterne Muster mit einer Schleife Allgemeine Java-Themen 5
Dragonfire Code Konvention for-Schleife / return Allgemeine Java-Themen 15
hdi Detail-Frage zur for-Schleife Allgemeine Java-Themen 9
J Thread pausieren, lange while-Schleife Allgemeine Java-Themen 8
Q Variable aus Schleife/Switch benutzen Allgemeine Java-Themen 7
J Erweiterte For-Schleife mit Vector Allgemeine Java-Themen 5
C Geschachtelte For-Schleife: Äußere Schleife wird nur einmal durchlaufen!? Allgemeine Java-Themen 3
W While-ESC-Schleife funktioniert nicht Allgemeine Java-Themen 3
W return Collection mit schleife durchsuchen Allgemeine Java-Themen 10
H Threads.... ich will aus der While-Schleife raus Allgemeine Java-Themen 6
calzone Warum wird nicht aus der Schleife gesprungen ? Allgemeine Java-Themen 2
lacyuu Schleife hängt sich auf, wieso?? Allgemeine Java-Themen 2
ModellbahnerTT Problem: Schleife über Textdatei Allgemeine Java-Themen 5
S Wie gross ist die Laufzeit für diese Schleife?? Allgemeine Java-Themen 8
J Schachbrett mit for- oder while-Schleife Allgemeine Java-Themen 22
I For- Schleife falsch? Allgemeine Java-Themen 8
T Schleife kurzzeitig anhalten Allgemeine Java-Themen 5
V Problem in While-Schleife Allgemeine Java-Themen 3
Escorter Switch in der Schleife! Allgemeine Java-Themen 4
C Auswertung der for each schleife? Allgemeine Java-Themen 2
GilbertGrape foreach Schleife Allgemeine Java-Themen 12
J FOR-Schleife-Problem Allgemeine Java-Themen 10
G Schleife durch Button beenden Allgemeine Java-Themen 6
S Schleife funktioniert nicht Allgemeine Java-Themen 2
G Anonymen Buttons in for schleife ActionListener hinzufügen Allgemeine Java-Themen 5
T getParameter in while schleife Allgemeine Java-Themen 3
O while - Schleife unterbrechen mit break; Allgemeine Java-Themen 5
R array.length in For-Schleife verwenden? Allgemeine Java-Themen 22
V Schleife funktioniert nicht wie gewünscht Allgemeine Java-Themen 5
T Schleife im Konstruktor? Allgemeine Java-Themen 9
S Schleife mit Durchlaufrate Allgemeine Java-Themen 5
R Per for schleife string propertys in einer datei speichern Allgemeine Java-Themen 15
H In Testklasse Objekte erzeugen und in einer Schleife ausgebe Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben