romy: timer im Hintergrund

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

--
DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
->Alles ist gut wenn es aus Schokolade ist
  1. 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

  2. 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

    --
    T'Pol: I apologize if I acted inappropriately.
    V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
    1. 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

      --
      DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
      ->Alles ist gut wenn es aus Schokolade ist
      1. 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

        --
        T'Pol: I apologize if I acted inappropriately.
        V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
        1. 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

          --
          DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
          ->Alles ist gut wenn es aus Schokolade ist
          1. 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

            --
            T'Pol: I apologize if I acted inappropriately.
            V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.