Announcement

Collapse
No announcement yet.

Zeitberechnung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeitberechnung

    Hallo zusammen,

    ich habe ein programm in Delphi geschrieben, welches zu bestimmten zeiten Tasks ausführen soll. Morgens, zu einer im Dialog definierbaren Uhrzeit findet der erste Job (ein Import) statt, abends (ebenfalls definierbar) erfolgt dann ein Abschlussprotokoll welches um diese Uhrzeit dann übertragen werden soll. Zwischen diesen Zeiten, und das ist meine Frage, sollen jede Stunde automatisch ein Job gestartet werden, welcher konsolidierte Protokolle erstellt und übertragen soll. Kennt sich jemand mit Zeitberechnung aus, also wenn ich morgens eine Uhrzeit habe (z.B. 8:00 Uhr) und ein abends (z.B. 20:00 Uhr) und dazwischen jede Stunde ermitteln? Morgens und abends kann hierbei dynamisch sein und geben den Rahmen vor.

    Gruß Uwe

  • #2
    Hallo,<br>Die Tageszeit ist der Nachkommawert eines TDatetime Wertes. 1,5 wäre demnach 1Tag und 12 Stunden. Eine Stunde ist 1/24. Eine Minute ist 1/(24*60). Eine Sekunde ist 1/(24*60*60).<br>Deine Schleife berechnet sich aus trunc((strtotime('ENDEZEIT') - strtotime('STARTZEIT')) / (1/(24*60))) <br>Der jeweilige Zeitpunkt ist strtotime('STARTZEIT') + (SCHLEIFE * (1/(24*60))) <br>Jetzt musst Du in regelmässigen Abständen über eine Schleife checken, ob die jeweilige Zeit vorbei ist. Die erste ermittelte, nicht verstrichene Zeit, mit der aktuellen vergleichen und wenn es passt deine Aktion starten.<br><br>Ein anderer Weg wäre, beim Start der ersten Aktion (STARTZEIT) in einer Variable die aktuelle Zeit (in deinem Beispiel 08:00) plus eine Stunde merken
    <PRE>
    NEXT_EVENT := time + (1/24)
    </PRE> Dann zyklisch überprüfen ob die Zeit erreicht wurde. Ist diese Zeit erreicht, wieder um eine Stunde erhöhen bis die Endezeit erreicht ist.
    <PRE>
    if (NEXT_EVENT + (1/24)) < strtotime(ENDEZEIT) then
    NEXT_EVENT := NEXT_EVENT + (1/24)
    else
    // Mache nix mehr :-)
    </PRE>
    <br> Michae

    Comment


    • #3
      Vielen Dank erstmal für die ausführliche Antwort!
      Ich hätte da noch eine Frage: angenommen, ich möchte einen Job 10 minuten vor der eingestellten Uhrzeit für den abendlichen Job (20:00 Uhr in meinem Beispiel) starten, also um 19:50 Uhr. Wie müsste denn diese Berechnung aussehen

      Comment


      • #4
        Hallo,<br>das ist relativ einfach, Du lädst im obigen Beispiel einfach keine Stunde auf die Zeitvariable, sondern bei deiner ersten Aktion nur 50 Minuten. (50 * (1/(24 *60))). Danach geht's im Stundentakt weiter, wie im Beispiel.<br>Das war's schon ;-)<br>Michae

        Comment


        • #5
          Ginge das ganze auch mit Timern? Ich habe nämlich für morgendliche und abendliche Übertragung Timer eingestellt, die bei Programmstart aktiviert werden. Ich würde nun gerne für die Übertragung 10 min vor der abendlichen Schlussübertragung auch einen Timer einsetzen. Was müsste denn nun für eine Bedingung in diesem OnTimerEvent stehen, damit der auch wirklich 10 min vor Endezeit losmarschiert

          Comment


          • #6
            Hallo,<br>baue Dir doch eine Art Prozessliste auf. Dies kann im einfachsten Fall eine Stringlist sein, in welcher Du Dir die Event's merkst. Diese Liste generierst Du einmal am Tag und checkst dann über einen Timer zyklisch ab, ob ein Event fällig ist.<br>Diese Eventliste könnte z.b. folgendes Format besitzen:<br>
            STARTZEIT;AKTION;BESCHREIBUNG<br>
            Im Timer Event legst Du eine Schleife über die Stringlist an und checkst, ob strtotime(copy(stringlist[x],1,pos(';',stringlist[x])-1)) erreicht ist. Sollte dies so sein, führst du die Aktion aus und löschst dieses Ereignis aus der Stringlist raus. So ganz grob skizziert würde ich das lösen :-)<br>Michae

            Comment


            • #7
              Vielen Dank für deine Unterstützung! Das scheint mir ein praktikabler Ansatz zu sein

              Comment

              Working...
              X