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???
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.
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.
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.
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!!
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?
^^. 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.
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.
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.
> 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.
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);
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??
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.
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?
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
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