sich wiederholender Countdown Timer

Joe Public

Mitglied
Hallo,

keine Ahnung ob ich das hier fragen "darf", denn es geht um Programmierung in Java und ich hab noch echt wenig Ahnung und mich nur mit Tante Google soweit gekämpft.

Ich möchte gerne folgendes realisieren (fragt nicht warum ;o) )
1. Gesamtzeit abfragen (z.B. 12 Min.)
2. Zeit1 abfragen (z.B. 10 Sekunden)
3. Zeit 2 abfragen (z.B. 5 Sekunden)

Jetzt soll innerhalb von 1. der Timer von 2. laufen und dann (hier eben) nach 10 Sekunden ein Piep ausgeben. Dann soll der Timer von 3. anfangen (5Sec) und dann wieder der von 2.………

Also quasi 2.&3. in Endlosschleife bis Zeit von 1. erreicht ist.

Da ich aber gerade erst angefangen habe Java zu lernen, habe ich mit gerade dieser Aufgabenstellung mehr Probleme als erwartet, daher die Frage ob mir jemand aus meinem Codegewurschtel wieder raus helfen kann.

Dank & Gruss

Code:
package FitFu;

import java.util.Timer;
import java.util.TimerTask;
import java.util.Scanner;
import java.awt.Toolkit;

public class Fitness {
	Timer timer;

	public Fitness(int seconds) {
		timer = new Timer();
		timer.schedule(new RemindTask(), seconds * 1000);
	}

	class RemindTask extends TimerTask {
		public void run() {
			System.out.println("Zeit vorbei");
			System.out.flush();
			Toolkit.getDefaultToolkit().beep();
			timer.cancel();
		}
	}

	public static void main(String args[]) {
		Scanner scan = new Scanner(System.in);
		int gesamt = 0;
		System.out.println("Gib mir die Geamtzeit");
		int dauer = scan.nextInt();
		scan.nextLine();

		System.out.println("Gib mir die Zeit 1");
		int zeit1 = scan.nextInt();
		scan.nextLine();

		System.out.println("Gib mir die Zeit 2");
		int zeit2 = scan.nextInt();
		scan.nextLine();
		int zeitSum = 0; 
		
		while (gesamt < dauer) {
			Reminder c = new Reminder(dauer);
			while (zeitSum<dauer) {
				zeitSum = zeitSum + zeit1 + zeit2;
				gesamt = gesamt + zeitSum;
				Reminder a = new Reminder(zeit1);
				Reminder b = new Reminder(zeit2);
			}
			System.out.println("Zeit " + zeit1 + " Sec. laueft");
			System.out.println("Zeit " + zeit2 + " Sec. laueft");
		}
		scan.close();
	}
}
 
Zuletzt bearbeitet:
Öhm naja, es läuft nicht ;o)

Also konkret, schaffe ich es nicht so wie beschrieben den Code hin zu bekommen.
Vielleicht zu meinem bisherigen Wissensstand, ich kenne alle Schleifen, Variablen, Verzweigungen usw., mit Arrays komme ich auch langsam klar, aber Klassen, Methoden und Konstruktoren sind noch seeeehr verwirrend……

Da ich bisher nur mit o.g. gearbeitet habe, finde ich die "Funktion" Zeit extrem verwirrend, weil ich ja keine for-Schleife setzen kann z.B. bis zeit2 erreicht o.ä. Also kann ich die einzelnen Zeitereignisse nicht richtig trennen (also im Kopf).
Aber ich will ja quasi jedes mal eine Schleife laufen lassen bis die Zeit erreicht ist, um dann zur naderen Zeit zu kommen und das endlos, bis "Gesamtzeit" erreicht ist.
Das kann ich aber nicht mit Schleifen erfassen o.ä mir bekannten Mitteln so das ich im uferlosen rudere……

Lange Beschreibung, aber so kannst Du ggf. nachvollziehen was ich meine und mir den erlösenden Hinweis geben auf meinen Denkfehler…

Dank & Gruss
 
Hi
Für die Zeit kannst du einfach Thread.sleep() verwenden, das funktioniert auch.

Vorgehensweise könnte also so sein:
1. Eingaben abfragen (sollte so funktionieren wie du es gemacht hast)
2. Schleife, bis Gesamtzeit abgelaufen ist. Die Aktuelle Zeit bekommst du über System.currentTimeMillis()
In dieser schleife wartest du für Zeit1 , lässt den Ton angehen, wartest für Zeit2, …

Wie man den Ton ausgibt, kann ich dir aber noch nicht sagen. Toolkit.beep() ist wahrscheinlich nicht ausreichend gut anpassbar.
 
Hi habs mal ausprobiert:
TestClass.java
Java:
package threads;

public class TestClass {

	public static void main(String[] args) {
		Thread t1 = new Thread(new TimerThread(5,20));
		t1.start();
		Thread t2 = new Thread(new TimerThread(10,20));
		t2.start();
	}

}
TimerThread.java
Java:
package threads;

public class TimerThread implements Runnable{
	private int seconds;
	private int end_time;
	private int time;

	@Override
	public void run() {

		int seconds_temp = 0;
		time = 0;
		while(true)
		{
			try {
				Thread.sleep(1000);
				seconds_temp++;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			if(seconds_temp==seconds)
			{
				beep();
				seconds_temp = 0;
				time = time + seconds;
			}
			if(time >= this.end_time)
				break;
		}
		
	}
	public TimerThread(int seconds,int end_time){
		this.seconds = seconds;
		this.end_time = end_time;
	}
	public void beep(){
//		java.awt.Toolkit.getDefaultToolkit().beep();
		System.out.println("beep" + seconds);
	}
}

Ist eigentlich ziemlich selbsterklärend :)
 
Zurück