You are not logged in.

Dear visitor, welcome to Dreamboard. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Friday, November 2nd 2007, 10:24am

Aufnahmetimer (Funktion: welche Aufnahme läuft aktuell?)

Hallo Leute,

arbeite gerade an einem Aufnahmetimer in Rails. Habe dabei ein grundsätzliches Problem, dass jetzt nichts mit der Programmiersprache zutun hat. Und weil hier so einige Entwickler sind, die sowas ähnliches wohl schon programmiert haben frage ich hier einfach mal nach:

Es sollen Timer mit einmaliger und mehrmaliger Startzeit (wiederholende Timer) programmiert werden können.
Wiederholende Timer sollen nur einmalig in die Datenbank eingetragen werden. Also nur der Starttermin mit Startzeit und Wiederholungsoptionen.
Es soll zudem jederzeit ermittelt werden können welche Aufnahme momentan läuft.
Dies soll das Programm selbst anhand der Datenbank ermitteln können, ohne zu schauen was denn gerade für eine Aufnahme aktuell läuft. Die Funktion brauche ich zum Abgleich, was denn jetzt wirklich läuft und was eigentlich nach Plan laufen sollte und auch für eine Vorschau in Kalenderform.
Wenn ich jezt die aktuell laufende Aufnahme für alle Timer mit einmaliger Startzeit ermitteln möchte, dann mache ich einfach folgendes:
Suche mir alle Termine raus deren Startdatum = heute und Startzeit <= jetzt, und für Startermine die < heute gestartet frage ich die Startzeit nicht ab.
Jeztzt sortiere ich nach Stardatum und suche mir davon die Starzeit die am größten ist aus und habe die aktuell laufende Aufnahme.

Das Problem liegt bei wiederholenden Timern:
Ich kann das Startdatum leider nicht mit einbeziehen, denn diese können beliebig in der Vergangenheit liegen. Und nur mit Startzeit komme ich leider nicht weiter. Ich kann zwar ermitteln ob ein wiederholender Timer heute stattfindet (bei wöchentlichen Timre z.B. durch Abfrage des Wochentages und dann einfach nach der Startzeit schauen)
aber bei der Funktion: welche Aufnahme läuft momentan gibt es folgendes Problem:
Da mache z.B. für wöchentliche Timer folgendes: Startdatum <= heute, Startzeit<= jetzt, wday = wday.
Das Problem ist folgende:
Es kann eine Aufnahme gestern abend um 23 Uhr gestartet sein welche am nächsten Tag um 1 Uhr noch läuft. Diese wird dann aber nicht als aktuelle Aufnahme angezeigt, weil Startdatum ist zwar kleiner als =< heute, aber Startzeit ist nicht <= jetzt, weil 23 Uhr ist größer als 1 Uhr. Hier kann ich um das Problem zu lösen nicht einfach vorher nach Startdatum sortieren. Da das in der Datenbank eingetragen Startdatum wie gesagt beliebig in der Vergangenheit liegen kann.

Dachte als nächtes die wiedeholenden Timer "virtuell" abzubilden, d.h. diese für eine gewisse Zeit vorzuberechnen, aber vielleicht hat jemand eine einfachere Idee?
_______________________________

D-box 1, D-box 2, Dreambox 7025SC

This post has been edited 6 times, last edit by "x-man" (Nov 24th 2007, 6:41pm)


2

Saturday, November 3rd 2007, 4:46am

generell hast du ein paar Möglichkeiten.
Die einfachste: Unix Timestamps ;) das sind einfach ganze Zahlen und deshalb ist das viel toller zu handeln als "echte Daten".

Du musst ansonsten immer prüfen ob startzeit + dauer > 24 und wenn ja das dann entsprechend handeln.
Generell würde ich mir immer aus Start und Endzeitpunkt bereithalten (letzteren kannst du ja problemlos aus Startzeit und Dauer berechnen), so kannst di ganz einfach prüfen ob eine Aufnahme aktuell aktiv ist:

Starzeitpunkt <= jetzt <= Endzeitpunkt.

Aber wie gesagt, benutze intern Unix Timestamps damit ist das alles um Welten einfacher!
mfg ,
Reichi

"Die Deutsche Rechtschreibung ist Freeware, sprich, du kannst sie kostenlos nutzen.
Allerdings ist sie nicht Open Source, d.h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."

This post has been edited 1 times, last edit by "Reichi" (Nov 3rd 2007, 4:47am)


3

Tuesday, November 20th 2007, 12:38am

x-man:

Ich denke ich verstehe dein Problem. Du suchst eine Art, einen wiederholenden Timer in einer Struktur zu beschreiben, und dann aus einer Menge von (möglicherweise wiederholenden) Timern in einem definierten Zeitrahmen alle Timerzeiten zu ermitteln.

Um ehrlich zu sein: Ich bin dran gescheitert. Aus dem Grund gibt es in enigma2 auch keine (ordentliche) Konsistenzprüfung von Timern. Man könnte sich sicherlich damit behelfen, vom letzten Aufnahmezeitpunkt aus sämtliche Timer soweit "fortzuschreiten" bis man in dem zu testenden Bereich ist, aber das wird irgendwann natürlich unpraktikabel.

An einer vernünftigen Lösung wäre ich auch interessiert :)

4

Tuesday, November 20th 2007, 10:39am

Das geht jetzt an rails vorbei, aber:
kann man nicht das delta von einem repeated timer zum start berechnen (geht ja einfach mit datetime objekten), vom delta dann nur die tage nehmen (oder h/m danach korrigieren), und von da aus weiterarbeiten.
Somit würde man den Timer zwar auch künstlich in die Zukunft setzen (da wird man wohl nicht drum herumkommen), aber man müsste den timer nicht "tag für tag" voranschreiten lassen.

Zur originalfrage fand ich Reichis vorschlag gar nicht so verkehrt. Einfache alternative, wenn man nur begrenzt mit Timestamps arbeiten will: Auch die wiederholenden Timer von gestern einbeziehen, und nachprüfen wann diese Enden. Ist es später als <heute, 00:00 Uhr>, so wird er in die Liste hinzugefügt.

5

Wednesday, November 21st 2007, 11:19am

Mein Vorschlag:
Jeder Timer hat neben einer Start- und Endzeit auch einen Start- und
Endtag.
Fuer einmalige Timer ist diese zur vollstaendigen Beschreibung bereits
ausreichend.
Fuer wiederholende Timer (dort werden dann analog die Startwochentage
und die Endwochentage betrachtet) muss der Start- und Endtag dann auf
die aktuelle Woche gemappt werden; wenn es mehrere Tage pro Woche
sind, dann entsprechend auch mehrfach. Zur Optimierung kann man nur
Timer betrachten, die gestern (Wochentag bezogen) oder heute beginnen
und die heute oder morgen enden.

Die Abfrage, ob gerade ein Timer laeuft, sieht dann so aus, dass man alle
Timer, deren Endtag < heute ist, schon mal vergessen kann.
Alle Timer deren Starttag > heute ist, fallen ebenso weg.
Zur aktuellen Zeit laufen dann alle Timer, deren Starttag < heute und
deren Endtag > heute sind,
oder deren Starttag < heute und deren Endtag == heute und deren
Endzeit >= JETZT sind,
oder deren Starttag == heute und deren Startzeit <= JETZT und deren
Endtag > heute sind,
oder deren Starttag == heute und deren Startzeit <= JETZT und deren
Endtag == heute und deren Endzeit >= JETZT sind.

Wenn man es etwas unuebersichtlicher mag ( ;-) ), kann man aber auch
mit UNIX Timestamps arbeiten. Das sollte dann trivialer sein.
Erst mit Zeitspannen wird es dann wirklich interessant (welcher Timer
laeuft im Zeitraum "X"?), aber das war ja nicht die Ausgangsfrage. ;-)

Gruss
DM7020HD SS, DM8000SSTT
Kein Support per PN! Nutzt das Forum zum Fragen, dann haben auch andere etwas davon.

6

Saturday, November 24th 2007, 8:33am

habs folgendermaßen gelöst. (ist nicht von mir):

- Timer werden in Datetimeformat gespeichert.

1. Abfrage: Ist ein physikalischer Timer für gesuchten Zeitraum eingetragen?

2. Wenn ja => ist dies der aktuell laufende Timer

3. Ansonsten => physikalischen Timer mit höchstem Startzeit kleiner und Endzeit größer als gesuchten Zeitraum suchen und zwischenspeichern

4. Alle wiederholenden Timer dessen Starzeit kleiner und Endzeit größer als gesuchten Zeitraum ist hochrechnen* (virtuelle Timer) bis Startzeit kleiner oder gleich gesuchter Zeitraum ist und zwischenspeichern.

5. Aus allen zwischengespeicherten Timern den mit höchstem Startzeitpunkt auswählen => aktuell laufender Timer


*tägliche Timer immer + 1 Tag, wöchentliche Timer + 1 Woche usw.
_______________________________

D-box 1, D-box 2, Dreambox 7025SC

This post has been edited 5 times, last edit by "x-man" (Nov 24th 2007, 8:55am)