# warten in einer while-schleife



## mote14 (12. Jan 2009)

da in dem forum hauptsächlich von applets geschrieben wird, weiß ich nicht ob der eintrag hier reinpasst, sonst habe ich aber leider nichts anderes gefunden. (es handelt um eine application)
mein problem ist folgendes:
ich habe eine while schleife, die jedes mal nach den andern anweisungen eine halbe sekunde warten soll.
ich habe es probiert mit 
	
	
	
	





```
try 
        {
        Thread.sleep(500);
        }
        catch(InterruptedException e){
        }
```
 am ende, aber leider zählt er dann die gesamte zeit (also bei 4 durchläufen 2 sekunden) zusammen und führt die anderen anwisungen erst danach auf einmal aus.
es sollte aber wie gesagt so sein, dass nach einigen anweisungen gewartet wird, dann anweisungen, dann warten usw. bis die while bedingung nicht mehr stimmt.

mein gesamter code schaut übrigens so aus:

```
while(s1>s2){
s2=s2+1;
s3=s1-s2;
jTextAreaAusgabe.append("Jetzt sind es schon "+s2+" Es fehlen nur noch "+s3+" bis " + s1);
try 
        {
        Thread.sleep(500);
        }
        catch(InterruptedException e){
        }

}
```
wüsste vielleicht jemand eine lösung für das problem?


----------



## diggaa1984 (12. Jan 2009)

gehts um das aktualisieren von nem textfeld? damit du das siehst müsstest du das auch in der schleife vornehmen, sonst siehst du erst was wenn die schleife komplett durch is, aber da brauchma mehr code um das genauer zu sagen


----------



## SegFault (12. Jan 2009)

ich tippe auch darauf das wie diggaa1984 es sagt, das feld in dem der String reingeschrieben werden soll nicht aktualisiert wird. dort gehört ggf sowas wie ein validate oder ähnliches rein damit der inhalt des Textfeldes (o.ä) auch upgedated wird.


----------



## mote14 (12. Jan 2009)

das wichtigste ist ja das warten, das funktioniert nicht richtig. wenn das was ihr sagt hilft hätte ich das bitte gerne näher erklärt


----------



## hdi (12. Jan 2009)

Änder deinen Code mal so:


```
while(s1>s2){
System.out.println("Doing stuf...");
s2=s2+1;
s3=s1-s2;
jTextAreaAusgabe.append("Jetzt sind es schon "+s2+" Es fehlen nur noch "+s3+" bis " + s1);
try
        {
        Thread.sleep(500);
        }
        catch(InterruptedException e){
           System.out.println("ERROR ON TRY BLOCk!");
        }

}
```
das ändert zwar nichts an der funktionalität, aber so sieht man zumindest was passiert. D.h. ob 
ein Fehler beim sleep kommt. Vllt bringst du nur was durcheinander, weil eig. muss das so funktionieren.


----------



## mote14 (12. Jan 2009)

das bringt auch nichts, er zählt die gesamte wartezeit zusammen und macht erst danach die aufgaben, die er eigentlich zwischen den pausen machen sollte...
danke im vorraus für konstruktive lösungsvorschläge!


----------



## java2000 (12. Jan 2009)

Ist es möglich, dass deine Schleife im Event-dispatching-thread (=EDT) abläuft? Das ist z.B. der Fall, wenn du einen Button klickst, an den ein ActionListener angehängt wurde, der dann diesen Code im actionPerformed() durchläuft. In dem Fall müsstest du diesen Code-Block in einem separaten Thread laufen lassen, nicht im EDT. Das könnte etwa so aussehen:


```
Thread thread = new Thread(new Runnable() {
	public void run() {
		// dein Code
	}
} );
thread.start();
```

Sofern dein Object jTextAreaAusgabe nämlich von der Klasse JTextArea ist, wird sie vom EDT neu gezeichnet, das heisst, wenn sich der Text ändert, muss der EDT kommen und den neuen Text in deinem GUI zeichnen. Wenn der EDT aber mitten in deinem Block steckt und gerade sleep(500) durchläuft, kann er ja nichts neu zeichnen.


----------



## Empire Phoenix (12. Jan 2009)

Der compiler optimiert evtl deinen code, da er das warten als sinnlos erkennt

am rande kleine andere sachen:

s2++;

Und versuch mal System.out.println("Dein text");

weil wie schon gesagt das textfeld evtl nicht geupdated wird, die Console aber garatiert das anzeigt.


----------



## mote14 (12. Jan 2009)

und wie kann ich machen dass nach einer halben sekunde die anweisungen kommen, dann wieder warten und so weiter bis die schleifenbedingungen nicht mehr erfüllt sind, so dass die anweisungen noch ausgeführt werden BEVOR die gesamte zeit abgelaufen ist, sondern eben nach 0,5  - 1-   1,5    usw sekunden?
danke


----------



## Empire Phoenix (12. Jan 2009)

Versuch erstmal das mit System.out, weil dann weist du, ob der compiler oder das jTextAreaAusgabe das problem darstellt


----------



## mote14 (12. Jan 2009)

das "ERROR ON TRY BLOCk!" erscheint nicht, das ist also auch eine sackgasse

@java2000: sorry ich hab deine antwort zuerst gar nicht gesehen. das ganze läuft wirklich mit einem button ab(actionPerformed)
wie kann ich das in einen eigenen Thread(und was ist das überhaupt?!) tun? 

bin ziemlicher anfänger, sorry wenn ich euch mit meinen oft relativ doofen fragen auf die nerven gehe

danke


----------



## Guest (12. Jan 2009)

Du hast vielleicht schon eine Ahnung von Threads, wenn du mehrere Threads hast, dann laufen die parallel und arbeiten ihren Code ab. Wenn du mit Swing arbeitest, hast du immer einen Event-Dispatching-Thread (genannt EDT), der für die Swing Komponenten verantwortlich ist. Wie der Name sagt, arbeitet dieser Tread einen Event nach dem anderen ab, das Zeichnen der Swing Komponenten ist z.B. ein solcher Event.
Wenn du einem JButton einen ActionListener anhängst, und dann diesen Button klickst, dann ist es auch der EDT, der den Code ausführt, den du in die actionPerformed geschrieben hast (ist ja ein ActionEVENT). Solange er mit dieser ActionPerformed beschäftigt ist, kann er nichts neu zeichnen, wenn sich also der Text deiner JTextArea ändert, zeichnet er das nicht sofort neu. Deswegen musst du einen neuen Thread starten, der solche lang andauernden Berechnungen durchführt, det EDT ist dann frei und hat "Zeit" Komponenten neu zu zeichnen, falls nötig (wenn sich eben der Text ändert).

Einen neuen Thread zu starten ist in Java denkbar einfach, siehe meinen letzten Post. Komplett könnte dein Code dann so aussehen:

```
JButton myButton = new JButton("Klick mich");
myButton.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent event) {
		
		// Instanziere einen neuen Thread
		Thread thread = new Thread(new Runnable() {
			public void run() {
				
				// dein Code
				while(s1>s2){
					System.out.println("Doing stuf...");
					s2=s2+1;
					s3=s1-s2;
					jTextAreaAusgabe.append("Jetzt sind es schon "+s2+" Es fehlen nur noch "+s3+" bis " + s1);
					try
						{
						Thread.sleep(500);
						}
						catch(InterruptedException e){
						   System.out.println("ERROR ON TRY BLOCk!");
						}

				}
			}
		} );
		thread.start(); // thread starten
		
	}
}
```

naja, sieht nicht super übersichtlich aus, aber


----------



## mote14 (12. Jan 2009)

funktioniert prächtig!!! und kapiert hab ich das auch noch... hoffentlich verlangst du jetzt von mir kein lehrgeld^^

danke, ich sitz jetzt echt schon wochenlang auf dem problem und jetzt hab ich den durchbruch...

vielen vielen dank! :toll:


----------

