# Timer pausieren



## Ondine (20. Mrz 2011)

GUten Abned,

ich habe ein Problem mit dem Timer. Ich habe einen Timer, der eine TimerTask ausführt. Ich würde die Ausführung gerne pausieren können und später wieder weiterführen können.


das ist die TimerTask
[JAVA=42]import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;

public class Schedule extends TimerTask{
	JFrame f; 
	DrawText d; // Zeichnen des Textes
	Timer t;
	int position; //Positio im Array
	long[] seconds; // Sekundenarray enthaelt Sekunden pro Wort
	int [] indexes; // array mit Indexen der Highlightwoerter


	/*
	 * seconds: Laenge in Mikrosekunden der Klangwoerter, indexes: Indezes der Woerter im Text,
	 * position = 0
	 */
	public Schedule(JFrame f, DrawText d, Timer t, int position, long [] seconds, int[] indexes){
		this.f = f;
		this.d = d;
		this.t = t;
		this.position = position;
		this.seconds = seconds;
		this.indexes = indexes;
	}

	public void run(){

			if(position < indexes.length){
				int j = indexes[position];
				d.setcurrentword(j);
			}
			f.repaint(); //neuzeichnen
			if(position < seconds.length){
				Schedule t2 = new Schedule(f, d, t, position+1, seconds, indexes);
				t.schedule(t2, seconds[position]/1000);
				//neuer Task mit naechsten Zeiten
			}
	}
}[/code]


und so starte ich den timer
[JAVA=42]
timer = new Timer();
t = new Schedule(f, p, timer, 0, mp, po);

		timer.schedule ( t, 0 );[/code]

irgendwie scheint es keine einfach Lösung für dieses Problem zu geben. Ich hab jedenfalls keine gefunden, obwohl das Problem ja ein ganz simples ist.

Noch mal zur Aufklärung: ich möchte später, wenn der benutzer in der GUI den Button "Pause" klickt, die Aufgabe die der Timer ausführt pausieren, wenn der Benutzer dann wieder den Button "Play" klickt, soll der Timer die Aufgabe wieder aufnehmen.

Würde mich über eine Lösung freuen.


----------



## antrox (20. Mrz 2011)

du kannst einen timer nicht pausieren und "dann wieder anfangen wo er aufgehoert hat"

darueber sind keine informationen vorhanden. und ein timer, ist kein objekt welches attribute besitzt z.B.

du kannst dir mit statischen variablen ergebnisse merken nachdem der pause button t.cancel ausgefuehrt hat und mit dem play button kannst du dann wieder einen neuen timer starten der die global abgespeicherten ergebnisse wieder aufnimmt

pause und play bei timers gibt es so nicht meines wissens


----------



## pmias (22. Mrz 2011)

Wie mein Vorredner schon sagte, Timer lassen sich nicht direkt pausieren. Du hast prinzipiell zwei Möglichkeiten, wenn Du pausieren möchtest:

1. Timer zerstören (cancel()) und beim Aufheben der Pause Timer neu instanzieren und alle TimerTasks neu scedulen.

2. Laß Deine TimerTasks eine gemeinsame Bool-Variable "pause" abfragen. Wenn diese true ist, wird im Task nicht weiter gearbeitet.


----------



## antrox (22. Mrz 2011)

Hallo,

ginge pausieren folgendermaßen?

Timer ist alle 400 ms z.B. ausgefuehrt...

Der Timer hat eine WHILE Schleife die von einer STATISCHNE BOOLEAN abhaengig ist. Sie wird bei TRUE durchlaufen. Außerhalb des Timers wird der Boolean auf FALSE gesetzt und dann geht der naechste planmaeßige Durchlauf des Timers einfach ohne die WHILE Schleife durch, also macht dieser Durchlauf gar nichts! Korrekt?

Der "PLAY!"- Button setzt dann diese STATISCHE Variable auf TRUE, so dass die WHILE Schleife wieder beachtet wird.

Klingt erstmal doch ganz gut ODER wird hier der Timer gekillt? Weil der Durchlauf sinnlos ist? Wie sieht das in Java aus?

Gruß


----------



## antrox (22. Mrz 2011)

folgendes geht

der timer laeuft die ganze zeit weiter, aber macht nur wenn TEST.b == true ist.

also kann man das auch "Pausieren"


----------



## antrox (22. Mrz 2011)

```
import java.util.Timer;


public class TEST {
	
	public static boolean b;
	
	public static void main(String[] args) {
		
		b = true;
		
		Timer t = new Timer();
		Task task = new Task();
		
		t.scheduleAtFixedRate(task, 1000l, 2000l);
		char c;
		
		while(true){
			c = IO.readChar("s fuer STOP! - g fuer GO!" + "\n");
			System.out.println();
			if (c == 's'){
				TEST.b = false;
			}
			if (c == 'g'){
				TEST.b = true;
			}
		}
	}
}
```


```
import java.util.TimerTask;


public class Task extends TimerTask{
	
	private int i;
	
	public Task(){
		super();
		this.i = 0;
	}
	
	@Override
	public void run() {
		if(TEST.b){
			System.out.println(i++);
		}
	}
}
```


----------

