Programm zum Ermitteln, dass Zeit sich geändert hat.



  • Hey ihr,

    Habe ein Programm geschrieben, welches merken soll, wenn ein Windowsbenutzer die Sekunden an der Windowsuhrzeit verstellt:

    #include <iostream> 
    #include <ctime>
    using namespace std; 
    int main () 
    {     
        time_t sekunden = time(NULL);
        tm * uhr = localtime(&sekunden);          
        int I_Sekunden = uhr->tm_sec;    
        while(1)                                    //Endlosschleife zum Überprüfen. Nachteil: 100% Prozessorauslastung
        {       
           if(!(uhr->tm_sec == I_Sekunden))         //Überprüfen ob Zeit von oben gemerktem Wert abweicht. Wenn ja...
           {
              if(uhr->tm_sec == I_Sekunden-1)       //... wird überprüft ob die Abweichung nur bedeutet, dass eine Sekunde vergangen ist.
                  sekunden = uhr->tm_sec;
              else                                  //Sind komischerweise zu viele Sekunden vergangen, muss jemand die Zeit verändert haben.
              {
                  cout << "Da muss wer was geaendert haben!" << endl;   //Hinweis darauf, dass Zeit geändert wurde.
                  I_Sekunden = uhr->tm_sec;         //I_sekunden wird wieder synchronisiert.
              }       
           }
        }
    }
    

    Rein Theoretisch müsste das Proggi ja laufen.
    Tut es aber nicht weil...

    1. Die Prozessorauslastung unheimlich hoch ist.
    Wie kann ich das anders als mit na while(1)-Schleife machen?

    2. Irgendwie funktioniert der Salat auch praktisch noch nicht... jemand ne Idee?

    cya
    David



  • Erstens: Die Prozessor-Auslastung kannst du etwas runterschrauben, indem du das Programm per Sleep() vorübergehend auf Eis legst.

    Zweitens: Es reicht nicht aus, wenn du am Anfang des Programms die Zeit ausliest - das mußt du regelmäßig in der Schleife erledigen:

    int main () 
    {
      time_t zeit=time(NULL),last=zeit;
      while(1)
      {
        zeit = time(NULL);                     //aktuelle Zeit auslesen
        int delta = zeit-last;                 //Differenz berechnen
        if((delta!=0)&&(delta!=1))
        {
          cout << "Da muss wer was geaendert haben!" << endl;
        }
        last = zeit;                           //Synchronisiert
        Sleep(500);                            //senkt Prozessor-Auslastung - wir arbeiten die Schleife nur 2x pro Sekunde ab
      }
    }
    


  • Okay...-.- Dachte, dass sich die Eigenschaften von 'Uhr' automatisch aktualisieren...-.- aber das ist ja auch unlogisch, weil das ja nach Bilden der Klasse eh nimmer sein kann...

    In welcher Bibliothek steht 'sleep'???



  • 777 schrieb:

    Okay...-.- Dachte, dass sich die Eigenschaften von 'Uhr' automatisch aktualisieren...-.- aber das ist ja auch unlogisch, weil das ja nach Bilden der Klasse eh nimmer sein kann...

    Wie sollte es denn? time_t ist ein einfacher Ganzzahl-Wert (auf meinem Rechner "typedef long time_t;"), der hat später keine Ahnung mehr, wie er initialisiert wurde.

    In welcher Bibliothek steht 'sleep'???

    WinAPI - <winbase.h> (btw, das ist ein großes S), auf Unix-Systemen mußt du ausweichen auf man: sleep(3)/de oder man: usleep(3)/de.



  • Jap... richtig.

    Etwas komisch an der Winbase ist, dass wenn ich die includiere sehr viele Fehler kommen...

    544 C:\Dev-Cpp\include\winbase.h `DWORD' does not name a type
    ...

    Irgendwas muss man doch noch beachten, wenn man die einbindet, oder?

    cya
    David

    #include <winbase.h>
    int main(void)
    {
    
    }
    


  • includier mal windows.h...



  • Et läuft!!! 😉

    Thx


Anmelden zum Antworten