# Ereignis nach ablaufzeitpunkt auslösen



## GRHenry (14. Jul 2011)

Hallo,

habe folgende Objektvariable:


```
private long ablaufzeitpunkt;
```

der Ablaufzeitpunkt liegt in der Zukunft, wenn dier Zeitpunkt erreicht, dann soll ein Ereignis ausgelöst werden, welcehs dann z.B. mit actionPerformed behandelt wird.

Wie geht denn das anmelden?

Ist super dringend, morgen schreiben ich die Arbeit!!!


----------



## SlaterB (14. Jul 2011)

irgendjemand muss sich darum kümmern, das könnte eine eigene Klasse von dir sein, 
oder irgendwas aus der API der höheren Sorte, nämlich ein eigener Ausführungsstrang, ein Thread,
speziell ein Timer aus der API,

wer immer sich darum kümmert, es gilt grundsätzlich: die Zeit bis dahin mit sonstiger Arbeit oder viel eher abwarten/ schlafen vertreiben,
dann die Aktion starten

Thread.sleep() zum schlafen, im einfachen Falle die genaue Zeitdifferenz ausrechnen, auch Timer nimmt gerne die fertig berechnete Wartezeit an,
ob es eine Klasse gibt der du den ablaufzeitpunkt als long oder Date direkt übergeben kannst, kann ich nicht positiv beantworten,
was nicht heißt dass nichts entsprendes vorhanden ist
(edit: ok, naheliegend, Timer kann das auch)


----------



## Marcinek (14. Jul 2011)

Da gibt es viele Möglichkeiten.

Wie wäre es mit einem Timer Task


----------



## grHenry (14. Jul 2011)

hier mal die Aufgabenstellung, vielleicht könnt ihr mir dann eher helfen. Konkret meine ich die Zeile: "– ein Listener-Objekt, das informiert wird, wenn die Uhr abläuft. Nehmen wir an, dass der Typ des
Listeners ITimerListener ist." der Aufgabenstellung.

Schreiben Sie eine Klasse CTimer, die die Eigenschaften einer Software-Uhr beschreibt. Die
Software-Uhr soll folgende Attribute haben:
– eine interne Nummer (vom Typ int), die automatisch vergeben wird,
Hinweis: Denken Sie an die Klassenvariable,
– einen Zeitpunkt, der angibt, wann die Uhr abläuft (in Millisekunden - vom Typ long)
Hinweis: Dieser Zeitpunkt ist die aktuelle Uhrzeit plus Zeitintervall (siehe unten),
– eine Kennung, ob sie zyklisch oder nur einmal ist (vom Typ boolean),
– ein Zeitintervall (in ms), das verwendet wird, um die Uhr neu zu setzen (im Falle einer
zyklischen Uhr),
– ein Listener-Objekt, das informiert wird, wenn die Uhr abläuft. Nehmen wir an, dass der Typ des
Listeners ITimerListener ist.
Für die aktuelle Uhrzeit sei die Klassenmethode gegeben:
long System.currentTimeMillis()
Schreiben Sie dazu
1. einen Standardkonstruktor, der alle Elemente mit Defaultwerten belegt,
2. einen normalen Konstruktor,
CTimer(int dauer, boolean zyklisch, ITimerListener listener)
3. getter-Methoden für die Art (zyklisch oder nicht) bzw. für die Wiederholungsdauer,
4. toString-Methode,
5. eine Methode int compareTo(CTimer other), die die internen Nummern der beiden
Uhren vergleicht (1, wen


----------



## SlaterB (14. Jul 2011)

das Listenerobjekt ist in einem Attribut gespeichert und wenn die Zeit gekommen ist wird davon eine Methode aufgerufen,
ziemlich unspektakulär, wo ist da die Frage?


----------



## grHenry (14. Jul 2011)

Hier mal meine bisherige Lösung, kannst Du mir sagen, was noch falsch ist oder was noch fehlt. Hab noch das Problem mit dem Listener.


```
import java.awt.event.*;

class ITimerListener implements ActionListener
{
	public void actionPerformed(ActionEvent e)
	{
		System.out.println("Uhr ist abgelaufen");
	}
}

public class CTimer
{
	private static int interneNummer = 0;
	private long ablaufzeitpunkt;
	private boolean zyklisch;
	private long zeitintervall;
	private ITimerListener listener;
	
	public CTimer()
	{
		interneNummer++;
		this.ablaufzeitpunkt = System.currentTimeMillis() + 10000;
		this.zyklisch = false;
		this.zeitintervall = 10000;
	}
	
	public CTimer(int dauer, boolean zyklisch, ITimerListener listener)
	{
		interneNummer++;
		this.ablaufzeitpunkt = System.currentTimeMillis() + dauer;
		this.zyklisch = zyklisch;
		this.zeitintervall = dauer;
	}
	
	public boolean getZyklisch()
	{
		return zyklisch;
	}
	
	public long getZeitintervall()
	{
		return zeitintervall;
	}
	
	public String toString()
	{
		return "hier wird die toString-Methode der Superklasse nach Wunsch überschreiben";
	}
	
	public int compareTo(CTimer other)
	{
		if((this.ablaufzeitpunkt - this.zeitintervall) < (other.ablaufzeitpunkt - other.zeitintervall))
		{
			return 1;	// this wurd vor other gestartet
		}
		else if((this.ablaufzeitpunkt - this.zeitintervall) > (other.ablaufzeitpunkt - other.zeitintervall))
		{
			return -1;	// this wurde nach other gestartet
		}
		else
		{
			return 0;	// beide sind zur gleichen Uhrzeit gestartet worden
		}
	}
	
	public static void main(String[] args) 
	{
		CTimer uhr1 = new CTimer(3000, false, new ITimerListener());
		CTimer uhr2 = new CTimer(5000, false, new ITimerListener());
		CTimer uhr3 = new CTimer();
		
		System.out.println(uhr3);
	}
}
```


----------



## SlaterB (14. Jul 2011)

der Listener ist absolut nicht dein Problem, die Methode aufrufen und fertig, den Parameter kannst du dir auch sparen,

beim Thementitel hast du noch richtig gelegen:
> Ereignis nach ablaufzeitpunkt auslösen
ist dein Problem, nicht
> Listener aufrufen

hab ja schon bisschen was dazu geschrieben, irgendwo muss gewartet werden, bis die Zeit gekommen ist,
direkt im Code, ob im Konstruktor oder in einer Methode,  ist bisschen schlecht weil dann der Aufrufer so lange nicht vorankommt,
mehrere Uhren gleichzeitig geht da kaum,
also muss ein Thread her der nebenläufig agiert, oder ein Timer-Objekt aus der API, irgendwelche Kenntnisse dazu? werde ich kaum erklären

wobei die Aufgabe auch ziemlich zu diesen wichtigsten Punkt schweigt,
mir persönlich ist nicht klar ob das hier überhaupt implementiert werden soll


----------

