Forum: PC-Programmierung Systemuhr in C++ einbeziehen


von Christian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!!

Bin ein C++ Neuling und verwende den C++ Builder6. Ich möchte ein
Programm schreiben mit dem es möglich ist mehrere Fernwirkgeräte über
Ethernet zu synchronisieren. Ich hätte ein Bild eingefügt um zu zeigen
wie ich mir das vorstelle.

Neben dem Text Uhrzeit sollte die Systemuhr eines Servers laufen bis in
den 10ms bereich. Dann würde ich gerne den BUtton Sync starten drücken
und alle angeschlossenen Geräte übernehmen diese Zeit.

Wie bekomm ich die Systemuhr und wie kann ich dies über Ethernet
schicken???

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

ups falsches Bild!!!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Unter Windows kann die Systemzeit mit der Funktion GetSystemTime bzw.
GetLocalSystemTime abgefragt werden.

Der Funktion muss ein Pointer auf eine Struktur vom Typ SYSTEM_TIME
übergeben werden, in die Zeitbestandteile aufgeschlüsselt sind.

GetSystemTime liefert UTC/GMT, GetLocalSystemTime berücksichtigt die
eingestellte Zeitzone.

Ansonsten kannst Du Dir ja auch mal das (S)NTP-Protokoll ansehen; das
Rad muss man ja nicht jedesmal neu erfinden, wenn man dran drehen will.

von Klaus H (Gast)


Lesenswert?

Zum Thema Systemzeit:
http://www.willemer.de/informatik/cpp/timelib.htm

Zum Thema Synchronisation: Das ist viel schwerer, als man denkt. Es
gibt da hochkomplizierte Algorithmen, in "Tanenbaum: Verteilte
Systeme" steht dazu eine Menge. Falls du eine Auflösung +-1sec.
brauchst, kannst du das aber auch relativ einfach machen.

von Klaus H (Gast)


Lesenswert?

Eine kleine Bettlektüre zum Thema Uhrensynchronisation:

http://klever.fh-augsburg.de/Vorlesungen/KooperativeSysteme/Folien/Zeitdienste.pdf

Dazu muss man noch sagen: Informatiker haben panisch Angst davor, dass
die Zeitinformation nicht eindeutig ist, also darf man nie die Uhr
zurückstellen. Meistens wird das mit dem Kompensationsfaktor der Uhr
geregelt.

Ich glaube auch, dass Einstein da noch vor seiner (kritisches dazu
vielleicht anderswann) Relativitätstheorie dran gearbeitet hat.

von Matthias G. (tissa)


Lesenswert?

Hallo ich habe das selbe Problem wie Christian nur hab ich keine Ahnung
wie ich die Uhr in einem Label ausgeben kann. wie geht das? hat jemand
ein Codebeispiel das fertig verwendbar ist??

Bitte helft einen Noob!!

von Klaus H (Gast)


Lesenswert?

Die kurze Antwort: einfach die Uhrzeit an das Label senden.

Die lange Antwort: Kommt darauf an, welche Umgebung du benutzt. Dein
Label hat sich die Funktion "setTest", oder der Zuweisungoperator ist
überschrieben, oder man kann das Label als Ausgabestream benutzen.

Welcher der beiden Schritte klappt denn nicht:
1. Uhrzeit holen
2. Text über ein Label ausgeben

Also, welche Umgebung hast du?

von Matthias G. (tissa)


Lesenswert?

^^. Leider gehen beide schritte nicht. ich benutze den C++Builder6. und
möchte grafisch programmieren, wie du ja weißt.

wie hol ich uhrzeit mit gettime oder?? aber wie sieht dies vom code aus
und welche headerfiles braucht das. und um es über das Label auszugeben
muss ich ja nur doppelklick auf das label machen oder?? und dort den
code einfügen.

von Klaus H (Gast)


Lesenswert?

Die Zeit würde ich mir mit Hilfe der Lib "time.h" holen. Codebeispiel
unter http://www.willemer.de/informatik/cpp/timelib.htm.
Oben ist noch "GetSystemTime" erwähnt, wahrscheinlich geht das nur
mit Visual Studio???

Mit C++Builder kenne ich mich nicht aus, wie weit kommst du? Zeigst du
schon eine graphische Oberfläche mit Label an, und kannst keinen Text
reinschreiben, oder klappt noch gar nichts?

Du musst dir eigentlich einfach die Deklaration der Label-Klasse
anschauen (vielleicht geht das über die Hilfe, ansonsten die Label.h),
da ist dann eine Funktion, die den Text des Labels setzt. Die musst du
einfach aufrufen.

von Matthias G. (tissa)


Lesenswert?

Es wird die UHR im label nicht angezeigt

von Klaus H (Gast)


Lesenswert?

Hier ist was zu Labels:
http://www.wer-weiss-was.de/theme158/article1409886.html#1410514

Wenn dein Label vom Typ TLabel ist, dann programmierst du einfach
mylabel->caption = "hallo";
bzw. mylabel.caption = "hallo";
Probier das mal aus, wenn das klappt, dann musst du statt "hallo" nur
die Uhrzeit eintragen.

von Matthias G. (tissa)


Lesenswert?

jop

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Oben ist noch "GetSystemTime" erwähnt, wahrscheinlich
> geht das nur mit Visual Studio???

Nein, auch andere Compiler sollten in der Lage sein,
Betriebssystemfunktionen aufzurufen.
Das ist eine Win32-API-Funktion.

von Matthias G. (tissa)


Lesenswert?

ja das ausgeben passt. kann mir jetzt einer sagen wie ich Millisekunden
generieren kann?? Und binde ich diese ein? ICh brauch unbedingt
Millisekunden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

GetSystemTime liefert in einem Feld der Struktur SYSTEM_TIME auch
Millisekunden.

von Klaus H (Gast)


Lesenswert?

Und in der time.h liefert "time_t time(0)" die millisekunden seit
1970. time_t ist einfach ein long-wert.
Was benutzt du denn? Win32-API oder time.h?

von Matthias G. (tissa)


Angehängte Dateien:

Lesenswert?

so hab ich bisher gemacht

von Matthias G. (tissa)


Lesenswert?

Und wie bekomm ich auch das Datum in die Anzeige??

von Matthias G. (tissa)


Lesenswert?

Kennt sich jemand mit UdpSocket und NMDayTime aus?? oder kennt jemand
nützlich links??

von Klaus H (Gast)


Lesenswert?

Zeit auf dem Label ausgeben:
mylabel->caption(itoa(time(0)));

itoa wandelt einen Integer-Wert in einen String um(Geht auch mit long).
Das ist C-Stil, in C++ geht das wahrscheinlich mit:

String s;
s<<time(0);
mylabel->caption(s);

von Matthias G. (tissa)


Lesenswert?

Creates and initializes an instance of TDateTime.

__fastcall TDateTime()
__fastcall TDateTime(const TDateTime& src)
__fastcall TDateTime(const TDateTimeBase& src)
__fastcall TDateTime(const double src)
__fastcall TDateTime(const int src)
enum TDateTimeFlag {Date, Time, DateTime};
__fastcall TDateTime(const AnsiString& src, TDateTimeFlag flag =
DateTime);
__fastcall TDateTime(unsigned short year, unsigned short month,
unsigned short day);

__fastcall TDateTime(unsigned short hour, unsigned short min, unsigned
short sec, unsigned short msec);


Was muss ich machen um einen von denen bzw den letzten zu verwenden. Wo
muss ich das hinschreiben? ins cpp file oder ins h file??

von Klaus H (Gast)


Lesenswert?

1. Die Header-Datei in deine cpp-Datei als include einfügen
2. in der CPP-Datei
TDateTime &tdt = new TDateTime(12,30,11,0);
oder TDateTime *tdt = new TDateTime(12,30,11,0);
schreiben (nur eins von beiden wird funktionieren, ich habe schon ewig
kein cpp mehr benutzt), um ein TDateTime-Objekt mit
12Uhr,30min,11sec,0msec (dein letzter Fall) zu erzeugen.

von Matthias G. (tissa)


Lesenswert?

Ich will ja keine Zeit einstellen sondern die vom System übernehmen. ist
auch egal wenn keine millisekunden aber zeit mit datum und die über UDP
übertragen. was muss ich da machen?

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

Bitte. Bitte Hilfe!! mega dringend!! Soweit hab ich den Code um über UDP
zu senden. Ich sende die Systemzeit siehe Anfang von sendto.

Was stimmt beim senden nicht? Wäre super mega wenn mir einer helfen
könnte.

mfg Christian

von Klaus H (Gast)


Lesenswert?

Am Anfang "#define _WIN32" einfügen, wenn das Teil unter Windows
läuft. Dann noch den Kommentar im Abschnitt "sendto()" entfernen (das
"/*" nach printf("\n%s",str);

Und in der 12ten Zeile vor dem Ende das */ entfernen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.