Uhrzeit einstellen (verwende aktuell ctime)



  • Hallo Folks,

    also ich schraube hier gerade an einer kleinen Clientapplikation. Diese ist zur Überwachung verschiedener Module da, und verschickt Alarme falls nötig. Jetzt ist bei solchen Alarmen ein Timestamp dabei, den ich via ctime fülle.

    Doch jetzt soll die Zeit einstellbar sein. Das heißt der Server schickt dem Client einen Timestamp der dann als aktuelle Uhrzeit genutzt werden soll.

    Wie mache ich das jetzt am dümmsten. Der Code sollte so weit wie möglich ISO C++ bleiben (auch wenn ich bisher ein paar Posixaufrufe nicht vermeiden konnte).

    Ich dachte mir einfach die Differenz zwischen meinem Timestamp und dem neuen aus zu rechnen und diesen dann immer zu addieren wenn ein neuer Timestamp erstellt wird.

    Jetzt wollte ich fragen, ob es eventuell eine bessere Lösung gibt, denn Timestamps werden an verschiedenen Stellen erstellt und überall müsste jetzt die Differenz vorhanden sein. Aber ich möchte nur sehr sehr ungern mit einer globalen Variable arbeiten...

    Bin für jede Idee dankbar!



  • Was genau soll die Aktualisierung bezwecken? Wenn du einen neuen, vom Server angegebenen Timestamp nutzen willst, warum überschreibst du den alten nicht einfach? Und was genau hast du mit den Differenzen vor?



  • Eine Möglichkeit wäre es, die Systemzeit entsprechend der Vorgabe zu ändern (aber das geht nicht mit purem Ansi-Code). Alternativ kannst du die Zeit-Verarbeitung in einer Klasse kapseln, die auch die Differenz zwischen Client-Zeit (time()-Rückgabe) und Serverzeit als (statischen) Member verwaltet.



  • @mad_martin:
    Ich hab mich blöd ausgedrückt, sorry.

    Der Timestamp im Client wird in jeden Alarm reingeschrieben. Das heißt wenn um 12:34 Uhr ein Alarm erzeugt wird, steht dieser Timestamp im Alarm. Doch wenn der Server die Uhrzeit einstellen will, zum Beispiel um 13:30 Uhr (Clientzeit) auf 14:35 Uhr ergibt sich hier eine Differenz von 1 Stunde und 5 Minuten.

    Die Systemzeit zu ändern ist leider nicht möglich, da die Software später auf einen Mikrocontroller ohne Betriebssystem (möglichst leicht) portierbar sein soll.

    Ich denke das Kapseln in eine Klasse ist das einzig sinnvolle.



  • Tobias W schrieb:

    Die Systemzeit zu ändern ist leider nicht möglich, da die Software später auf einen Mikrocontroller ohne Betriebssystem (möglichst leicht) portierbar sein soll.

    Auch ein Mikrocontroller hat eine Systemzeit - wenn nicht, dürfte time() keine verwertbaren Informationen liefern 😉



  • Das ist richtig, aber der Aufruf um diese Systemzeit zu ändern ist von Controller zu Controller doch unterschiedlich. Und ich will nicht auf ein paar Plattformen beschränkt sein.



  • Ah, verstehe ich das richtig, dass du den Timestamp des Alarms relativ zur vom Server gegebenen Zeit anpassen willst, d.h. wenn der Alarm um 14:05 kam und du nachträglich deine Uhr um 30min vorstellst, der Alarm auf 14:35 angepasst wird, so daß die relative Zeit, die vergangen ist, immer gleich bleibt? Hab ich das so richtig verstanden?



  • Im Prinzip schon. Die Systemzeit beim Client ist bei deinem Beispiel 14:05, die Systemzeit beim Server 14:35.

    Alarme die um 14:05 (Clientzeit) erstellt werden, sollen dann aber den Timestamp 14:35 tragen.

    Somit kann der Server alle Clients mit seiner eigenen Systemzeit einstellen, damit die Timestamps einheitlich sind (ein Uhrenabgleich sozusagen :).



  • Dann würd ich ebenfalls dazu tendieren, eine eigene Klasse zu machen, die die Timestamps kapselt. Wenn du die Timestamps der Clients verändern kannst, würd ich einfach die Differenz bei jedem Serverabgleich als Offset draufrechnen. Wenn du das gescheit kapselst, sollte es für den Client egal sein, wie und ob der Server synchronisiert.


Anmelden zum Antworten