mikrocontroller.net

Forum: PC-Programmierung Systemuhr in C++ einbeziehen


Autor: Christian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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???

Autor: Christian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ups falsches Bild!!!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus H (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus H (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine kleine Bettlektüre zum Thema Uhrensynchronisation:

http://klever.fh-augsburg.de/Vorlesungen/Kooperati...

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.

Autor: Matthias Gratl (tissa)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: Klaus H (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias Gratl (tissa)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus H (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Gratl (tissa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es wird die UHR im label nicht angezeigt

Autor: Klaus H (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist was zu Labels:
http://www.wer-weiss-was.de/theme158/article140988...

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.

Autor: Matthias Gratl (tissa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jop

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Gratl (tissa)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
GetSystemTime liefert in einem Feld der Struktur SYSTEM_TIME auch
Millisekunden.

Autor: Klaus H (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias Gratl (tissa)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
so hab ich bisher gemacht

Autor: Matthias Gratl (tissa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie bekomm ich auch das Datum in die Anzeige??

Autor: Matthias Gratl (tissa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kennt sich jemand mit UdpSocket und NMDayTime aus?? oder kennt jemand
nützlich links??

Autor: Klaus H (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Matthias Gratl (tissa)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Klaus H (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Gratl (tissa)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus H (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.