Autor |
Beitrag |
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 11.01.03 20:27
Schon oben. ´s lagert hier (4,23k). Ist nur der Quellcode; ich denke: Delphi-Versions unabhängig; für Nicht-Visual Studio-Besitzer (ich erstelle die Dialogressourcen damit!) liegt eine "dialog.NoVS.rc" bei.
btw: Ich bin ein bisschen unsicher wg. dieser Zeile:
Quelltext
Bei Burgpflanze steht im Code (s. erste Seite) "1900", aber die ganzen Infos zum Protokoll beziehen sich auf die abgelaufenen Sekunden seit dem 1. Januar 1970, Null Uhr. Wie dem auch sei - auf die Zeit hat´s keinen Einfluss. Ich lasse das Ding gerade laufen, und es wird mir auch 18 Uhr 31 (UTC) angezeigt.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 11.01.03 22:56
Wenn ich da 1900 eintrage dann stimmt auch das Datum. Im laufe des Abends wird von mir noch ein Programm kommen um dann die Systemzeit mit dem Zeitserver abzugleichen.
Kennt in diesem Zusammenhang jemand eine Liste mit zeitservern? Einer kann ja mal down sein.
Hier mal der aktuelle Stand der Dinge (noch ohne Soße, da noch nicht fertig): INetTime
Ungepackte Exe da nonVCL. 
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 12.01.03 09:47
Zitat: | Wenn ich da 1900 eintrage dann stimmt auch das Datum. |
Ja, das habe ich auch gemerkt. Nun wissen wir auch, warum 1900 da stehen muss ...
Zitat: | Im laufe des Abends wird von mir noch ein Programm kommen um dann die Systemzeit mit dem Zeitserver abzugleichen. |
Irgendwie habe ich genau das ... äh ... befürchtet ...
Zitat: | Kennt in diesem Zusammenhang jemand eine Liste mit zeitservern? |
Nein. Aber ich hoffe, du machst es von Anfang an so, dass alle Zeitserver in einer externen INI liegen. Dann kann der Anwender deine Vorgaben rausschmeißen und eigene benutzen, oder eigene hinzufügen, usw.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 12.01.03 16:16
MathiasSimmack hat folgendes geschrieben: | Bei Burgpflanze steht im Code (s. erste Seite) "1900", aber die ganzen Infos zum Protokoll beziehen sich auf die abgelaufenen Sekunden seit dem 1. Januar 1970, Null Uhr. |
Sorry, mein Fehler. Im Time Protocol heißt es ganz klar:
Zitat: | The time is the number of seconds since 00:00 (midnight) 1 January 1900 GMT, such that the time 1 is 12:00:01 am on 1 January 1900 GMT; this base will serve until the year 2036. |
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 12.01.03 17:35
MathiasSimmack hat folgendes geschrieben: | Aber ich hoffe, du machst es von Anfang an so, dass alle Zeitserver in einer externen INI liegen. Dann kann der Anwender deine Vorgaben rausschmeißen und eigene benutzen, oder eigene hinzufügen, usw. |
Tztztz, was denkst du von mir? 
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 12.01.03 18:46
Es war ja nur ein Gedanke, Luckie. Anhand der Exe kann man ja nicht sehen, ob da schon INI-Funktionalität drin ist ... Ich hab´s mal ausprobiert für das DateTime-Beispiel aus den Tutorials.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58:
| // // Liste mit den Zeitservern aus der INI-Datei lesen // const szDateTimeIni = 'DateTime.ini'; szIniKey = 'serverlist'; BUFSIZE = 16348;
procedure LoadTimeServers(hCombobox: HWND); var buf, p : pchar; kl : array of string; i : integer; begin // Inhalt der Combobox leeren SendMessage(hCombobox,CB_RESETCONTENT,0,0);
// Topicnamen aus der INI lesen GetMem(buf,BUFSIZE); try SetLength(kl,0); if(GetPrivateProfileString(szIniKey,nil,nil,buf,BUFSIZE, pchar(ExtractFilePath(paramstr(0)) + szDateTimeIni)) <> 0) then begin p := buf; while(p^ <> #0) do begin SetLength(kl,length(kl)+1); kl[length(kl)-1] := p;
inc(p,strlen(p)+1); end; end; finally FreeMem(buf,BUFSIZE); end;
// Werte aus der INI lesen, & in die Combobox eintragen if(length(kl) > 0) then begin GetMem(buf,BUFSIZE); try for i := 0 to length(kl)-1 do begin ZeroMemory(buf,BUFSIZE); if(GetPrivateProfileString(szIniKey,@kl[i][1],nil, buf,BUFSIZE,pchar(ExtractFilePath(paramstr(0)) + szDateTimeIni)) <> 0) then
SendMessage(hCombobox,CB_ADDSTRING,0,LPARAM(buf)); end; finally FreeMem(buf,BUFSIZE); end;
SetLength(kl,0); end;
// Eintrag auswählen, wenn vorhanden if(SendMessage(hCombobox,CB_GETCOUNT,0,0) > 0) then SendMessage(hCombobox,CB_SETCURSEL,0,0); end; |
Ein paar Server, die ich noch so gefunden habe:
Quelltext 1: 2: 3: 4: 5:
| [serverlist] svr1=ntpserv.fh-magdeburg.de svr2=ntps1-0.cs.tu-berlin.de svr3=ntps1-1.cs.tu-berlin.de svr4=ntps1-1.uni-erlangen.de |
Allerdings hab´ ich´s mir verkniffen, jede Sekunde zu checken. Da leidet die Performance. Ein Buttonklick wäre sinnvoller.
Ach ja, als Tipp für dein Programm: bitte nicht selbst wählen lassen! Ich würde prüfen, ob eine Verbindung besteht, und dann anbieten, die Zeit von einem Server zu holen, usw.
Mir gefällt´s nämlich nicht, wenn sich jedes itsy-bitsy Programm ins Web wählt. Ist aber nur meine Meinung.
So, bleibt nur noch die Frage: was bedeutet der Multiplikator "10.000.000"? Warum gerade 10Mio? Bzw. was bedeutet dieser Wert?
Wer mir das erklärt, wird von mir namentlich im Update des DateTime-Beitrags von Luckies Tutorials erwähnt ...
Hm, is´ wahrscheinlich kein Anreiz? 
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 12.01.03 20:32
So hier ist es: www.auq.de/viewtopic.php?t=5857
Es wählt sich nur leider selber ein. mal sehen, was sich da machen läßt.
Aber in einem extra Thread checken, ob eine Verbindung betseht, halte ich für etwas übertrieben.
|
|
Burgpflanze 
      
Beiträge: 67
Windows2000 Prof. SP4
Delphi7 Enterprise
|
Verfasst: So 12.01.03 21:18
Unter den folgenden Links findet ihr eine ganze Reihe von
Zeitservern aus aller Welt:
www.eecis.udel.edu/~mills/ntp/clock1a.html
www.eecis.udel.edu/~mills/ntp/clock2a.html
Die beiden wichtigsten deutschen sind:
ptbtime1.ptb.de und ptbtime2.ptb.de .
(Beide Physikalisch-technische Universität Braunschweig)
Gruss, Burgpflanze
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 12.01.03 22:15
Luckie hat folgendes geschrieben: | Aber in einem extra Thread checken, ob eine Verbindung betseht, halte ich für etwas übertrieben. |
Wie: extra Thread? Da ich im genannten DateTime-Beispiel aus den Tutorials einen 1sec-Timer habe (der ja die lokale und UTC-Zeit im System liest und anzeigt), spricht nichts dagegen, in dieser WM_TIMER-Abfrage mit InternetGetConnectedState den Web-Status zu prüfen und den Button für die Server-Zeit entsprechend freizuschalten ... Ach was red´ ich; ich bastel noch ein bisserl am Quellcode rum, dann schick´ ich´s dir einfach mal. 
|
|
Burgpflanze 
      
Beiträge: 67
Windows2000 Prof. SP4
Delphi7 Enterprise
|
Verfasst: Mo 13.01.03 05:39
@Matthias
Oder benutze ein asynchrones socket, dann brauchst du das nicht in
einen extra Thread packen
@Luckie
Das einzigste, was ich bisher zu "10.000.000" in Erfahrung bringen konnte:
- Dieser Wert steht für die Anzahl von 100-Nanosekunden-Intervallen pro Sekunde
(1 sec = 1.000 millisec = 1.000.000 microsec = 10.000.000 100-nanosec-Intervalle)
@All
Und hier meine überarbeitete Funktion - nun wird auch die Zeitzone berücksichtigt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| // time ist schon der "gedrehte" Wert procedure SyncTime(time: Cardinal); const SYSTEM_SECONDS = 10000000; var bias: Integer; ft: TFileTime; st: TSystemTime; li: TULargeInteger; tz: TTimeZoneInformation; begin st.wYear := 1900; st.wMonth := 1; st.wDayOfWeek := 0; st.wDay := 1; st.wHour := 0; st.wMinute := 0; st.wSecond := 0; st.wMilliseconds := 0;
if not SystemTimeToFileTime(st, ft) then Exit;
case GetTimeZoneInformation(tz) of TIME_ZONE_ID_DAYLIGHT: bias := tz.Bias + tz.DaylightBias; TIME_ZONE_ID_STANDARD: bias := tz.Bias + tz.StandardBias; TIME_ZONE_ID_UNKNOWN: bias := 0; else Exit; end; bias := -bias;
li.QuadPart := Int64(time) * SYSTEM_SECONDS + Int64(bias * 60) * SYSTEM_SECONDS; li.QuadPart := li.QuadPart + TULargeInteger(ft).QuadPart;
if not FileTimeToSystemTime(TFileTime(li), st) then Exit;
SetLocalTime(st); SendMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0); end; |
Mfg Burgpflanze
(PS: Vielleicht erwähnt mich Luckie auch in seinem iTime  )
|
|
|