Zeit vergleichen



  • Hi,

    ich möchte gerne einen Wecker bauen.

    Dafür brauche ich ja die aktuelle Zeit. Diese kann ich durch die TTimer-Komponente mit Time() abfragen. Wie kann ich jedoch zwei Zeiten vergleichen?

    Hier unten mein Code: Wo liegt der Fehler? Natürlich könnte ich es in Strings konvertieren und diese vergleichen. Jedoch ist das mit zusätzlichem Rechenaufwand verbunden, den man doch bestimmt umgehen kann?

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    #include <time.h>
    #include "Unit1.h"
    #include <windows.h>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TfrmMain *frmMain;
    //---------------------------------------------------------------------------
    __fastcall TfrmMain::TfrmMain(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::btnAktivierenClick(TObject *Sender)
    {
        String Sweckzeit=edtH->Text+':'+edtM->Text+':'+edtS->Text; //edtH, M, und S enthalten jeweils die Stunden, Minuten und Sekunden
        weckzeit=StrToTime(Sweckzeit);
        timer->Enabled=true; //Timer wird aus Performancegründen erst dann aktiviert, wenn Wecker gestartet wird.
        btnAktivieren->Enabled=false;
        btnAktivieren->Caption="aktiviert...";
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::timerTimer(TObject *Sender)
    {
        if(weckzeit==Time()) //Wecker piepst, wenn Weckzeit erreicht wird; 400ms Intervallüberprüfung (was nicht funktioniert)
        {
            for(int i=0; i<10; ++i)
               Beep(2000, 500);
        }
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::timerJetztTimer(TObject *Sender)
    {
        lblJetzt->Caption=TimeToStr(Time()); //aktuelle Zeit wird im 1s Intervall aktualisiert angezeigt
    }
    //---------------------------------------------------------------------------
    


  • Hallo

    TDateTime kann wie jeder andere Datentyp auc direkt mit den Operatoren verglichen werden :

    TDateTime x = ...;
    TDateTime y = ...;
    if (x == y) ...
    if (x < y) ...
    

    bis bald
    akari



  • Mhm. Irgendwie funktioniert das nicht. Könnte es daran liegen, dass TTimer nicht genau genug ist?



  • Hallo

    "Irgendwie funktioniert das nicht" ist keine ausreichende Fehlerbeschreibung... ich weiß ja nicht mal wie dein relevanter Quellcode nun aussieht.
    TTimer ist nicht auf die Millisekunde genau. Für Sekundengenau reichts aber aus. Natürlich darfst du trotzdem nicht den Fehler machen und nur auf Gleichheit prüfen, sondern zusätzlich ob deine Zielzeit überschritten ist.

    TDateTime Akuell, Ziel;
    if (Aktuell >= Ziel)
    {
      // Ziel erreicht.
    }
    

    bis bald
    akari


Anmelden zum Antworten