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.
ja das ausgeben passt. kann mir jetzt einer sagen wie ich Millisekunden generieren kann?? Und binde ich diese ein? ICh brauch unbedingt Millisekunden.
GetSystemTime liefert in einem Feld der Struktur SYSTEM_TIME auch Millisekunden.
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?
Kennt sich jemand mit UdpSocket und NMDayTime aus?? oder kennt jemand nützlich links??
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.