timer im Hintergrund
romy
- programmiertechnik
0 Danny0 Michael Schröpl0 romy
Guten Morgen,
Mich würde mal interessieren, welche Möglichkeiten es gibt eine Art timer zu programmieren. zB. Bei 3 Min anfangen und dann rückwärts zählen.
Gibt es für sowas Funktionen oder macht man das selbst.
Meine Idee war:
forschleife von 180 bis Null runterzählen -> den Wert als Zeit angeben und dann eine Art sleep für eine Sekunde einfügen.
Hab es aber noch nicht umsetzen können. Ausserdem denke ich,dass es ja dann nicht im Hintergrund läuft, aber es sollen andere Aktionen gleichzeitig ausführbar sein.
Bevorzugte Sprache ist C, aber mir geht um den Algorithmus.
danke
ciao
romy
Moin Romy,
normalerweise braucht man sich um den Countdown selbst nicht zu kümmern, dafür gibt es in den meisten Programmiersprachen fertige Funktionen oder Klassen.
Zum Algorithmus könnte ich mir vorstellen, dass man technisch nicht rückwärts zählen muß, sondern einfach bei Start der aktuellen Zeitpunkt (z.B. Millisek. nach 1970) ausliest und die Länge des Countdown addiert (=Endzeitpunkt). Anschließend wird solange gewartet, bis aktuelle Zeit > Endzeit.
In 68000er Assembler habe ich sowas ähnliches schon gemacht. Da griff ich direkt auf die Hardware zu, d.h. spezielle Timer-Register, die nach einer bestimmten Zeit einen sog. Interrupt auslösten und damit das laufende Programm unterbrachen, bzw. eine Funktion aufruften.
Was C angeht, kann ich zur Umsetung leider nicht viel sagen aber
eine forschleife von 180 bis Null runterzählen mit Sleep klingt nicht verkehrt. Aber dafür gibt's bestimmt auch eine spezielle Funktion, die im Hintergrund arbeitet...
Schönes Wochenende!
Danny
Hi romy,
Mich würde mal interessieren, welche Möglichkeiten es gibt eine Art timer zu programmieren. zB. Bei 3 Min anfangen und dann rückwärts zählen.
... und dann wohin mit der Ausgabe? In ein DOS-Fenster oder was?
forschleife von 180 bis Null runterzählen -> den Wert als Zeit angeben und dann eine Art sleep für eine Sekunde einfügen.
Streiche "eine Art".
Hab es aber noch nicht umsetzen können.
Wo genau ist Dein Problem?
Ausserdem denke ich,dass es ja dann nicht im Hintergrund läuft,
Definiere "im Hintergrund" bei einem echten Multitasking-System.
Da gibt es keinen "Vordergrund" oder "Hintergrund" - es gibt nur Prozesse in Warteschlangen. Einige befinden sich in der CPU-Warteschlange und bewerben sich um die CPU, andere befinden sich in Warteschlangen für diverse I/O-Geräte. Und dann gibt es da noch die Warteschlange für Prozesse, die auf ein Betriebssystem-Ereignis warten; dorthin wird "sleep" Deinen Prozeß sinnvollerweise stellen. (Alles etwas vereinfacht, aber so ungefähr funktioniert task scheduling jedenfalls.)
Bevorzugte Sprache ist C, aber mir geht um den Algorithmus.
Ich weiß nicht genau, was Du an dieser Stelle mit "Algorithmus" meinst. Vertraue dem Betriebssystem - das weiß, was es zu tun hat.
Viele Grüße
Michael
Hi Michael
... und dann wohin mit der Ausgabe? In ein DOS-Fenster oder was?
entweder Konsole oder Dialogfenster (es geht ja erstmal ums prinzip)
Wo genau ist Dein Problem?
Bsp:
Konsole:
start der datei
start des timers, der zählt runter währenddessen ich gleichzeitiversuche Matheaufgaben zu lösen, wenn der timer bei 0 ist, gibt es keine Aufgaben mehr
Ausgabe
Wie kann ich dass realisieren?
Bsp2:
Dialogfenster (bestehend aus mehreren labels und einem los-Button und dem Timerfeld (label))
onButtonClick {
generiere einige Ausgaben auf den labels
for-schleife für timer mit sleep
}
Aber: anstatt das erst die Ausgaben gemacht werden und dann der timer runterläuft. geht erst der timer und dannkommen die Aussgaben ???
Habe dann auch noch ein kleines Problem mit Stringverknüpfungen für die Zeitausgabe.
Bsp:
int i;
for(i=180;i>0;i++){
int min = i/60;
int sek = i%60;
char gesamt = ????? ((char)min + ":" + (char) sek)
}
es muss ein char sein, da ich es sonst nicht ausgeben kann
aber auch hier geht es eher ums prinzip. (string.h ist natürlich eingebunden)
danke für Deine Hilfe
ciao
romy
Hi romy,
start des timers, der zählt runter währenddessen ich gleichzeitiversuche Matheaufgaben zu lösen,
was verstehst Du darunter? Was geht es den Rechner an, was in Deinem Kopf abläuft?
Ich verstehe das Konzept der Dialogführung noch nicht, welches von Deinem Programm realisiert werden soll. Was will das Programm alles quasi-simultan tun? Wann genau tut das Programm was, in Abhängigkeit von welcher Art von wie getätigter Eingabe?
Beschreibe Dein Problem mal als endlichen Automat, mit Zuständen und Kanten und Übergangsereignissen ...
Viele Grüße
Michael
Hi Michael,
Ich verstehe das Konzept der Dialogführung noch nicht, welches von Deinem Programm realisiert werden soll. Was will das Programm alles quasi-simultan tun? Wann genau tut das Programm was, in Abhängigkeit von welcher Art von wie getätigter Eingabe?
Ich versuche es mal. ;)
BSP: Konsole:
Start des Programms
Start des Timers
Anzeige der Ablaufenden Zeit
Anzeige der ersten Matheaufgabe
(ich löse sie im Kopf ;))
drücke enter
bekomme die nächste Aufgabe
(währenddessen läuft die Zeit ab)
nächste Aufgabe
nächste Aufgabe
Zeit ist Abgelaufen
Ich bekomme ein Ergebnis
Anzeige:
Zeit: 3:00
Aufgabe: 3+5
ist das etwas verständlicher?
(Vielleicht kennst Du unter Linux das Konsolenspiel Boggle? Dort ist das so ähnlich)
danke für Deine Hilfe
romy
Hi romy,
bekomme die nächste Aufgabe
woher? Ist das eine Programmausgabe?
Zeit ist Abgelaufen
Ich bekomme ein Ergebnis
Hm. Du wartest also simultan auf zwei Ereignisse - einen Tastatur-Event und einen Timer-Event.
Da wirst Du davon abhängig sein, wie Dein Betriebssystem die entsprechenden Events verarbeitet.
Womit liest Du von der Tastatur? Ist das ein "keypress"-Aufruf (wie ich ihn aus Borland-Pascal in Erinnerung habe), also einer, der auch schon ohne vorliegende Eingabe zurückkehrt?
Wenn ja, dann könntest Du einfach die Tastatur und die Uhrzeit abwechselnd abfragen. Dann würdest Du ein "busy wait" verwenden - aber vielleicht kannst Du Dir das leisten, weil der Rechner nicht gleichzeitig noch etwas Drittes tun soll.
Wenn Du statt dessen ein normales "read" von der Tastatur verwendest, dann wird Dir das die Steuerung nicht freiwillig zurück geben. Selbiges kannst Du aber ggf. erzwingen, wenn Du beim Betriebssystem einen Timer Interrupt anmeldest. Wie das genaut geht, hängt von Deinem OS und von Deiner Programmiersprache ab. Du könntest versuchen, Deinem Prozeß, der auf die Tastatur wartet, periodisch Signale zu senden, welche dieses Warten unterbrechen und dem Prozeß die Chance geben, "auf die Uhr zu sehen". Beispielsweise durch einen zweiten Prozeß, der in einer Endlosschleife abwechselnd ein "sleep 1" und ein "kill -HUP $PID1" macht (jetzt mal "UNIX style" formuliert), während der erste Prozeß zuerst eine Unterbrechungsbehandlungsroutine beim Betriebssystem (oder dem Laufzeitsystem der Sprache) anmeldet, dann permanent auf die Tastatur wartet (und im Falle einer Eingabe die nächste Aufgabe ausgibt), während seine Unterbrechungsbehandlungsroutine einfach nur auf die Uhr schaut und das Programm beendet, falls die Zeit abgelaufen ist, und ansonsten nichts tut.
Der "Algorithmus" hängt letzten Endes sehr stark davon ab, welche Basis-Befehle Du zur Verfügung hast.
Um auf mehr als ein Ereignis gleichzeitig warten zu können, hast Du verschiedene Möglichkeiten:
a) alle Ereignisse permanent zyklisch pollen,
b) alle Ereignisse per Signal melden lassen,
c) eine Misch-Strategie aus a) und b), wie oben beschrieben.
Viele Grüße
Michael